我有一种情况需要在会话中获得一些属性,但我还没有找到一个成功的解决方案来在成功登录后延迟加载路由。
所以这就是交易 - 当用户登录时,他们会被发送到电话号码路由。应用程序控制器上的this.get(' session.currentUser')尚未设置。
当我走另一条路然后回来时,它设置正确。如果我在登录后通过电话号码路由然后刷新页面,则由于初始化程序中的deferReadiness和advanceReadiness,电话号码正确加载。我无法在登录前推迟阅读,因为该应用已经加载并准备就绪。
唯一缺少的部分是,在用户登录后,它应该加载<div class="airport-selections">
<label class="airport-label" for="airport-from">
Departure:
</label>
<input type="text" class="airport-input">
</div>
中的数字,这是下面粘贴的最后一段代码。但是,由于routes/phone-numbers.js
尚未设置,因此未加载myStoreId
。
我已经尝试了很多东西来完成这项工作,并且正在寻找关于最后一部分的一些想法。它离工作太近了,但只丢了一小块。
session.currentUser
答案 0 :(得分:1)
尝试使用Promise:
// controllers/application.js
export default Ember.Controller.extend({
myStore: Ember.computed('session.currentUser', function(){
// return the store object that is associated with the current user
return new Ember.RSVP.Promise(resolve => {
if(this.get('session.isAuthenticated')){
if(this.get('session.myStore')){
resolve(this.get('session.myStore'));
} else {
console.log(this.get('session.currentUser'));
// this is where the problem is. The session.currentUser is not populated yet.
this.get('store').find('store', {user: this.get('session.currentUser.id')}).then(function(data) {
this.get('session').set('myStore', data.get('firstObject'));
resolve(this.get('session.myStore'));
});
}
}
});
})
});
// routes/phone-numbers.js
export default Ember.Route.extend({
setupController: function(controller, model){
this._super(controller, model);
let myStoreId = this.controllerFor('application').get('myStore').then(myStore => {
let myStoreId = myStore.get('id');
if(!myStoreId){
console.log(this.get('session.currentUser'));
// there is no currentUser set on the session after login
} else {
this.store.find('store-phone-number', {'store': myStoreId}).then(function(numbers){
controller.set('numbers', numbers);
});
}
});
}
});
答案 1 :(得分:1)
Daniel建议玩弄承诺让我得到了解决方案。基本上我需要返回一个承诺,如果myStore尚未设置,并且还必须在登录后的第一条路径中考虑到这一点。
export default Ember.Controller.extend({
myStore: Ember.computed(function(){
// return the store object that is associated with the current user
if(this.get('session.isAuthenticated')){
if(this.get('session.myStore')){
return this.get('session.myStore');
}else{
return new Promise(resolve =>{
this.get('session').setCurrentUser().then(data => {
this.get('store').find('store', {user: this.get('session.currentUser.id')}).then(data => {
this.get('session').set('myStore', data.get('firstObject'));
resolve(this.get('session.myStore'));
});
});
})
}
}
}),
});
export default Ember.Route.extend({
setNumbers: function(controller, id){
this.store.find('store-phone-number', {'store': id}).then(numbers => {
controller.set('numbers', numbers);
});
},
setupController: function(controller, model){
this._super(controller, model);
if(this.controllerFor('application').get('myStore.id')){
let myStoreId = this.controllerFor('application').get('myStore.id')
this.setNumbers(controller, myStoreId);
}else{
let myStore = this.controllerFor('application').get('myStore').then(data => {
this.setNumbers(controller, data.id);
});
}
},
});