在我的索引路由中,我有一个观察者在会话服务中设置用户对象时触发一个动作,如下所示。这很好 - 控制台日志'索引路由观察者被解雇了#39;行动开始了。
路由/索引
session: Ember.inject.service(),
sendTheAction: function() {
console.log('index route observer fired');
this.send('checkLicense');
}.observes('session.user'),
actions: {
checkLicense: function() {
if (this.get('session.user.email)) {
//get the user's email and send off an AJAX request.
}
},
}

我还有一个注销路由,其中(除其他外)将session.user设置为空对象,然后转换到登录路由。我只是使用指向' logout'的链接帮助器。发起这个。
路由/注销
session: Ember.inject.service(),
actions: {
didTransition: function() {
this.set('session.user', {});
this.transitionTo('login');
}
}

如果我在索引路径中并单击注销,则会开始转换到注销。然后,当log.user在注销路由的didTransition挂钩中设置为{}时,索引路由中的观察者将触发。控制台日志'索引路由观察员被解雇'但后来我得到一个控制台错误说
Error while processing route: logout Nothing handled the action 'checkLicense'.
我不确定退出路径的didTransition挂钩是如何仍然可以触发前一路由中的观察者,因为我认为只有当转换完全解决时才会触发.Transition。
我认为它正在寻找行动" checkLicense"在退出路线中。
任何人都可以澄清为什么观察者仍然会发射,以及如何解决这个问题?
答案 0 :(得分:3)
观察者仍然会发射,这是预期的行为。原因是;路线是SINGLETON;它们在过渡时不会被破坏。所以;如果您在路线中定义观察者并观察可能由其他路线,组件,控制器等更新的值,那么您的观察者仍将工作!所以;小心在单身人士中使用观察员(控制器,服务,路由等)。
我创建了一个显示您提到的确切案例的twiddle。这里的有效问题实际上是“为什么send
内的index.js
行动被委托给另一条路线?”这是来自Ember.js api的answer。它在send
方法定义中说“向路由器发送一个动作,它将它委托给当前活动的路由...”。所以;发生错误;因为当前活动路线不再是index
;没有找到行动!
因此;你能做什么?为什么要在index.js
内向自己投掷一个动作?只是做一个正常的函数调用!!!如果你还需要这个动作;您也可以在动作中调用相同的功能。请参阅modified twiddle以了解我的意思。
总结;单身内部的观察者无论如何更新依赖关键字都会有效!希望;现在一切都清楚了。最诚挚的问候。