emberjs | beforeModel 钩子在模型钩子之后触发

shm*_*mit 2 ember.js

我有一个具有以下定义的 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);    
    });     
  } }
});
Run Code Online (Sandbox Code Playgroud)

我将它导入到我的路线中,如下所示

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); 

  }
});
Run Code Online (Sandbox Code Playgroud)

我预期的警报顺序是“在模型之前”->“1234”、“模型中”、“1234”。然而,警报的实际顺序是“在模型中”->“未定义”、“在模型中”、“1234”

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

Lux*_*Lux 5

你的问题是beforeModel钩子在钩子之前执行model,但是从getLoggedinUser后面返回的承诺。

然而,路由器将等待承诺解决,所以解决方案很简单:只需返回承诺!

所以替换这个:

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

有了这个:

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