余烬 | beforeModel 钩子在模型钩子之后触发

emberjs | beforeModel hook is firing after model hook

我有一个定义如下的 mixin。

import Ember from 'ember';

export default Ember.Mixin.create({

  loggedinUser: {},
  beforeModel() {  

    if (!this.get('AuthService').isAuthenticated()) {
       this.transitionTo('login');
    }

    this.get('AuthService').getLoggedinUser()
    .then(results => {this.loggedinUser = results;
      alert("in before model"); 
    alert(this.loggedinUser.requestorId);    
    });     
  } }
});

我在我的路由中导入如下

import UnAuthenticatedRouteMixin from '../mixins/un-authenticated-route-mixin';

export default Ember.Route.extend(UnAuthenticatedRouteMixin, {

  model(){  
    this._super(...arguments);

    alert("in model");
    alert(this.loggedinUser.requestorId); 

  }
});

我预期的警报顺序是 "in before model " -> “1234”、"in model"、“1234”。然而,警报的实际顺序是 "in model " -> "undefined", "in before model" , "1234"

如何确保 beforeModel 钩子在模型钩子之后触发。

我正在申请强制执行订单的一种解决方法是 return 来自 beforeModel 挂钩的承诺,以便模型挂钩等待该承诺的解决。 mixin 代码更改为如下所述。但是,有没有更好的方法来处理这种情况?

   import Ember from 'ember';

export default Ember.Mixin.create({

  loggedinUser: {},
  beforeModel() {  

    if (!this.get('AuthService').isAuthenticated()) {
       this.transitionTo('login');
    }

    return this.get('AuthService').getLoggedinUser()
    .then(results => {this.loggedinUser = results;
      alert("in before model"); 
    alert(this.loggedinUser.requestorId);    
    });     
  } }
});

您的问题是 beforeModel 挂钩在 model 挂钩之前执行,但承诺 return 来自 getLoggedinUser returnes。

然而,路由器将等待 promise 解决,所以解决方案很简单:只是 return promise!

所以替换这个:

this.get('AuthService').getLoggedinUser()
  .then(results => {this.loggedinUser = results;
    alert("in before model"); 
    alert(this.loggedinUser.requestorId);    
  });  

有了这个:

return this.get('AuthService').getLoggedinUser()
  .then(results => {this.loggedinUser = results;
    alert("in before model"); 
    alert(this.loggedinUser.requestorId);    
  });