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

时间:2018-01-16 19:02:39

标签: 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);    
    });     
  } }
});

我在我的路线中导入它如下

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

  }
});

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

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

2 个答案:

答案 0 :(得分:3)

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

路由器会等待promises解析,所以解决方案很简单:只需返回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);    
  });     

答案 1 :(得分:0)

我申请强制命令的一个解决方法是从beforeModel钩子返回promise,以便模型钩子等待该promise的解析。 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);    
    });     
  } }
});
相关问题