Ember控制器实例化时机及controllerFor与previousTransition相关疑问
作为曾经折腾过Ember老版本的开发者,我来给你拆解这几个新手常见的疑问:
1. controllerFor的工作原理是什么?
在Ember v3.0里,controllerFor是路由类自带的方法,核心作用就是从Ember的依赖注入容器中获取指定路由对应的控制器实例。
Ember的容器会统一管理应用里大部分对象的生命周期(包括控制器、路由、服务这些),而控制器默认是单例模式——也就是说,每个路由对应的控制器只会被创建一次,之后每次调用controllerFor时,返回的都是同一个实例。举个例子,当你在某个路由里写this.controllerFor('login'),Ember会先检查容器里有没有login控制器的实例,有就直接返回,没有才会新建实例并存入容器。
2. 路由到对应路径时loginController是否会被重新实例化?
完全不会。刚才提到过,Ember v3.0里的控制器默认是单例对象,一旦创建就会一直存在于容器中,除非你特意配置让它变成非单例(这种场景极少)。所以不管你多少次跳转到login路径,用的都是同一个loginController实例,不会重新创建,实例上的属性自然也会保留。
3. previousTransition是如何持久化以便在loginController中访问的?
答案还是绕回单例特性:当你在其他路由(比如需要登录权限的路由)里,通过controllerFor('login')拿到它的实例,然后给这个实例设置previousTransition属性时,这个属性就存在了单例实例的内存中。
等用户后续跳转到login页面时,路由关联的还是同一个loginController实例,你自然就能访问到之前存的previousTransition了。只要应用不刷新、不重启,这个属性就会一直保存在实例上,直到你主动修改或清除它。
内容的提问来源于stack exchange,提问作者karthikaruna

