Ember.js 延迟加载导致Ember中未定义的数据
我使用了一周的ember.js,遇到了一个关于ember数据和ember.js的问题。在名为Ember.js 延迟加载导致Ember中未定义的数据,ember.js,ember-data,Ember.js,Ember Data,我使用了一周的ember.js,遇到了一个关于ember数据和ember.js的问题。在名为User的模型上,我有一个简单的1:N关系用户有许多插槽,这些插槽由开始时间和结束时间定义 在一个名为每天插槽的组件中给定用户的所有插槽都会使用以下js代码按天过滤: /* ... rest of component.js of slots-per-day ... */ filteredSlots: Ember.computed('user', function() { let time
User
的模型上,我有一个简单的1:N关系<代码>用户有许多插槽
,这些插槽由开始时间
和结束时间
定义
在一个名为每天插槽的组件中
给定用户的所有插槽都会使用以下js代码按天过滤:
/* ... rest of component.js of slots-per-day ... */
filteredSlots: Ember.computed('user', function() {
let time = moment();
return this.get('user.slots').filter( (slot) => {
let left = moment(time).startOf('day');
let right = moment(time).endOf('day');
let start_time = moment(slot.get('start_time'));
let end_time = moment(slot.get('end_time'));
console.debug(slot.get('start_time'));
return start_time.isBetween(left, right) || end_time.isBetween(left, right);
});
})
/* ... rest of component.js of slots-per-day ... */
我在不同的方法中遇到了几个问题:
控制台.debug
输出未定义
,但插槽数量刚好合适。所以我猜ember data已经加载了插槽的数组,但是忘记加载其余的数据了。如果我转换到同一路线,所有数据都会正确显示,console.debug
返回不同的矩.js-datesuser.slots
添加到该属性的依赖项列表中,它将被计算两次。这两种计算都会产生与(1)中相同的调试输出:未定义
user.slots.@each.start\u time
,则该属性的计算值为该页上的组件数量乘以插槽数量(非常慢)。尽管它速度很慢,但它仍能正常工作并正确呈现数据 /* SlotRoute ... */
setupController(controller, model){
this._super(controller, model);
controller.set('time', this.get('time'));
controller.set('users', model.users);
controller.set('timeScope', this.get('timeScope'));
},
users: Ember.computed('time', function() {
return this.store.query('user', {
slots: {
time: this.get('time').toString(),
timeScope: this.get('timeScope')
}
});
}),
model(params) {
return Ember.RSVP.hash({
users: this.get('users'),
slots: this.store.get('slots')
});
},
/* ... */
上面列表的位置(1)、(2)和(3)没有变化。第3号是写入计算属性的正确方法,尤其是使用异步关系时。您必须在某处支付价格,如果您想在过渡期间支付,您可以使用
afterModel
假设您使用model
钩子获取用户。如果在其他地方加载,您还可以使用该特定路线的afterModel
/beforeModel
路线
model(params){
return this.store.find('user', 1);
},
afterModel(model, transition){
return model.get('slots');
}
使用某种服务的路线
afterModel(model, transition){
return this.get('someservice.user.slots');
}
这不符合预期。我不得不对我的代码进行一些修改,因为这条路线涉及所有用户。但行为没有改变。每个用户都会多次渲染该组件。还有其他想法吗?承诺可能是解决方案吗?这是承诺路线,因为我们将承诺返回给afterModel挂钩,它在继续之前等待承诺解决。听上去,你有一系列的承诺,如果你用吸引用户的路线(可能还有你尝试过的路线)更新你的问题,然后我会用相应的解决方案更新答案,这将是最简单的。