我有一个带有以下定义的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钩子。
答案 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);
});
} }
});