灰烬 - 在下一条路线的didTransition挂钩中设置属性时,前一路线中的​​观察者将触发

时间:2017-03-16 06:59:51

标签: javascript ember.js

在我的索引路由中,我有一个观察者在会话服务中设置用户对象时触发一个动作,如下所示。这很好 - 控制台日志'索引路由观察者被解雇了#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"在退出路线中。

任何人都可以澄清为什么观察者仍然会发射,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

观察者仍然会发射,这是预期的行为。原因是;路线是SINGLETON;它们在过渡时不会被破坏。所以;如果您在路线中定义观察者并观察可能由其他路线,组件,控制器等更新的值,那么您的观察者仍将工作!所以;小心在单身人士中使用观察员(控制器,服务,路由等)。

我创建了一个显示您提到的确切案例的twiddle。这里的有效问题实际上是“为什么send内的index.js行动被委托给另一条路线?”这是来自Ember.js api的answer。它在send方法定义中说“向路由器发送一个动作,它将它委托给当前活动的路由...”。所以;发生错误;因为当前活动路线不再是index;没有找到行动!

因此;你能做什么?为什么要在index.js内向自己投掷一个动作?只是做一个正常的函数调用!!!如果你还需要这个动作;您也可以在动作中调用相同的功能。请参阅modified twiddle以了解我的意思。

总结;单身内部的观察者无论如何更新依赖关键字都会有效!希望;现在一切都清楚了。最诚挚的问候。