让我们说有一条路由能够在用户请求时更新它的数据(假设后端返回同一个呼叫的不同数据,可能是它的股票数据,或者只是随机数字。)
export default Ember.Route.extend({
model() {
return this.get('store').findAll('foo');
},
actions: {
invalidateModel() {
this.refresh();
}
}
});
现在,直接使用此模型的组件将按预期更新其视图。
Model: {{#each model as |m|}}{{m.bar}}{{/each}}
<button {{action "refreshModel"}}>Refresh model</button>
但是,如果组件使用的是计算属性来观察模型,则更新不会继续进行。
模板
Model: {{#each computedModel as |m|}}{{m}}{{/each}}
<br>
<button {{action "refreshModel"}}>Refresh model</button>
组件
computedModel: Ember.computed('model', function() {
return this.get('model').map(function(m) {
return `Computed: ${m.data.bar}`;
});
}),
如需完整复制品,可以查看:https://github.com/myartsev/ember-computed-properties-on-data-model
最新提交是非工作计算属性的情况 previous commit是在直接使用模型时所有内容仍能正常工作的时候。
我错过了什么?
答案 0 :(得分:4)
您的计算属性正在侦听对数组本身的更改。尝试使用model.[]
computedModel: Ember.computed('model.[]', function() {
return this.get('model').map(function(m) {
return `Computed: ${m.data.bar}`;
});
}),
<强>更新强>
Here is a twiddle显示上述解决方案可以解决问题。
如果它无法正常运行,那么你的api返回的内容就会出现问题。
根据我对如何发送动作的评论。您使用的是我不熟悉的2岁syntax from Ember 1.13。
答案 1 :(得分:3)
computedModel: Ember.computed('model.@each.bar', function() {
return this.get('model').map(function(m) {
return `Computed: ${m.data.bar}`
});
})
关闭循环; @Subtletree的答案非常接近,让我思考正确的轨道。
差异很微妙但很重要,model.[]
只有在返回的数据大小发生变化时才会起作用;添加或删除元素。在我的例子中,返回的数据大小保持不变,只有它的值得到更新。因此,正确的方法是收听您正在寻找的从属密钥,在这种情况下,&#39; model。@ each.bar&#39;。