Ember:在router.willTransition钩子中等待promise

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ember:在router.willTransition钩子中等待promise相关的知识,希望对你有一定的参考价值。

我想允许一些用户输入路线,而其他用户则不允许。

我使用simple auth进行身份验证,它将使用promise加载用户数据。问题是willTransition()不会等到我的用户被加载,因此,它将显示索引路由,然后我可以检查用户是否可以访问它。

所以在router.js我有:

willTransition(oldRoute, nextRoute, transition) {
    return this.get('session').authenticate('authenticator:application').then(() => {
      if(this.get('user.isAdmin')) return true
      else alert('not allowed to enter')
    })
}

这只是一个真实的例子我更喜欢user.isCat和猫被允许进入/猫和/可爱的路线。

我知道我也可以在路线的user.isAdmin查看beforeModel(),但我有很多其他路线和权限组,所以我想在路由器中有一个地方来管理它。

答案

您可以中止转换并在承诺解决后重试。

所以你的例子看起来像这样:

willTransition(transition) {
  if (this.get('pendingTransition.targetName') == transition.targetName) {
    this.set('pendingTransition', null);
    return true;
  }

  transition.abort();

  this.get('session').authenticate('authenticator:application').then(() => {
    if (this.get('user.isAdmin')) {
      this.set('pendingTransition', transition);
      transition.retry();

    } else {
      alert('not allowed to enter')
    }
  })
}

看到:

另一答案

willTransitionTo不会停止承诺。因此,实现的最佳方法是在这种情况下中止转换。像下面这样的东西可以帮到你。

willTransition: function(transition) {
   return this.get('session').authenticate('authenticator:application').then(() => {
      if(!this.get('user.isAdmin')){
         transition.abort();
      }
      if(!this.get('user.isCat')){
         transition.abort();
      }
   });
}

希望这可以帮助。

以上是关于Ember:在router.willTransition钩子中等待promise的主要内容,如果未能解决你的问题,请参考以下文章

在 Ember 1.12.0 和 Ember CLI 中使用实例初始化程序

我在 Ember-CLI 中将 Ember-I18n 的翻译放在哪里?

在ember中运行时创建模型属性

如何在 Ember 中使用 jsTree 插件

来自ember数据存储的ember map对象

如何在 Ember 控制器中运行操作 afterRender