Javascript Ember.js Computed属性在排序后不更新hasMany项
我有以下按日期显示订单的设置: 我有下面的模板显示了给定一周内的每个订单:(为了简洁,我去掉了一些html) 模板:Javascript Ember.js Computed属性在排序后不更新hasMany项,javascript,ember.js,Javascript,Ember.js,我有以下按日期显示订单的设置: 我有下面的模板显示了给定一周内的每个订单:(为了简洁,我去掉了一些html) 模板: {{#each ordersByDate in ordersByDateOfWeek}} <div class="orders-by-date"> <div> <span>{{order-date-formatted ordersByDate.date}}</span>
{{#each ordersByDate in ordersByDateOfWeek}}
<div class="orders-by-date">
<div>
<span>{{order-date-formatted ordersByDate.date}}</span>
</div>
{{#each order in ordersByDate.orders}}
{{order.number}} {{! updates correctly}}
{{order.market.name}} {{! a hasmany property called here, does not update}}
{{/each}}
</div>
{{/each}
ordersByDateOfWeek: function () {
var result = []; // return value
var object = null
var date = null;
// add every order to an array with a date an order objects
this.forEach(function (order) {
// get the date of the order
date = order.get('created');
// create a new object that holds the orders for a given date
object = result.findProperty('date', date);
// create the object if it does not exist
if (!object) {
object = {
date: date,
orders: [],
// some more
};
// add the object with the date to the result
result.push(object);
}
// add the orders to the current object
object.orders.push(order);
// more calculations done here below
});
}.property('model', 'sortProperties', 'sortAscending'),
它所做的是创建一个对象数组,如下所示:
[
{
"date":"2014-12-08",
"orders":[// order objects here],
// some more properties
},
{
"date":"2014-11-08",
"orders":[],
},
{
"date":"2014-10-08",
"orders":[],
},
]
我已经试了好几个小时了,但我的脑袋还是绕不过去。我的直觉告诉我这和承诺有关?但是在“orders:[]”
数组中,它们是真正的余烬对象,所以我认为它必须工作
我希望有人能给我指出正确的方向
非常感谢大家
编辑:100%清楚:我的订单模型仅由订单组成。我自己创建的自定义对象。我想这就是为什么数据绑定会被破坏的原因 计算属性不是魔术;-)它们很棒,但不是魔法 我怀疑,由于您正在侦听对
'model'
的更改,因此当您更改嵌套在此对象中的属性时,它不会触发更新。仅当对象引用'model'
发生更改时,才会重新计算属性
在这种情况下,如果您实际为对象分配了一个新数组,则至少需要“model.@each.orders”
。如果只是通过稍后添加更多对象来更改阵列,则需要两步解决方案。如果是这样的话,写一篇评论,我会扩展我的答案
阅读:问题在于,只有在
ordersByDateOfWeek
更新时,模板才会自动更新。每当其监视的任何属性发生更改(“model”、“sortProperties”、“sortAscending”
)时,就会发生这种情况。当您自己构建order对象时,引擎盖下的ember将根据需要添加它们,但它们不会导致ordersByDateOfWeek
更新,因此您的模板将无法识别更改
最简单的解决方案是使用实际属性(即您的订单模型),并将它们添加到'model.@each.orders'
到ordersByDateOfWeek
的观察列表中。如果需要诸如date
之类的额外字段,请将它们创建为模型上的计算属性,如下所示:
date: Ember.computed.alias('created')
您应该很少需要手动创建对象。是否签出了
Ember.computed.sort
?还有一个标准属性arrangedContent
,如果您正在查找此类内容,它将用作排序的结果。您好,我有点晚了,但谢谢您的回答!但是,我不知道这将如何工作,因为arrangedContent
也用于我已经使用的sortProperties
。请参阅:是否必须使用自己的排序内置程序编写自己的arrangedContent
?如果你在回答中提供了一个有效的例子,我会接受它。经过几天的摆弄,我对它进行了赏金。我无法到达我想要的地方,因为安排的内容不可能在原始项目之前有一个日期。@DelphiLynx您能,请,分享您的小提琴,这样我们就可以与一个基地一起工作吗?jsbin/JSFIDLE肯定会有帮助…我必须补充一点,我的模型完全由订单组成。我放在前面的自定义日期是我自己的实现,用于显示如图所示的数据。(我也会把这些信息添加到问题中)谢谢你的完整回答。有点晚了,不过上次我没有参加这个项目。你的回答起了作用,我编辑了计算属性的观察列表,并添加了模型。@each
。(在我的情况下,订单不是很多)