Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ember.js Computed属性在排序后不更新hasMany项_Javascript_Ember.js - Fatal编程技术网

Javascript Ember.js Computed属性在排序后不更新hasMany项

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>

我有以下按日期显示订单的设置:

我有下面的模板显示了给定一周内的每个订单:(为了简洁,我去掉了一些html)

模板

{{#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
。(在我的情况下,订单不是很多)