如何在不使用ArrayController的情况下对ember中的嵌入记录进行排序

时间:2013-10-07 13:32:50

标签: ember.js ember-data

我想在我的内容中对嵌入式记录进行排序。最初我将嵌入式记录分离为ArrayController并对其进行了排序 - 它非常直接,但现在我被告知我应该只使用没有ArrayController的嵌入式记录。我按照http://www.javascriptkit.com/javatutors/arraysort2.shtml对数组对象进行排序,内容正在排序,但视图没有相应更新。我的功能如下:

    setSort: function (sort) {
        var sortedContent = this.get('content.analyticsRunParameters');
        sortedContent.sort(function(a, b){
            var colA=a.get(sort).toLowerCase(), colB=b.get(sort).toLowerCase();

            if (colA < colB) //sort string ascending
                return -1;
            if (colA > colB)
                return 1;
            return 0; //default return value (no sorting)
        });
        this.set('content.analyticsRunParameters',sortedContent);

        console.log(sortedContent);//is sorted
        console.log(this.get('content.analyticsRunParameters'));//is sorted

    }

在我的内容排序时,有没有办法更新视图?或者使用ArrayController唯一的方法呢?感谢。

1 个答案:

答案 0 :(得分:0)

我在另一篇文章中找到了解决方案:Ember.ArrayProxy changes not triggering handlebars #each update

我不知道这是否也是最佳解决方案。看起来我应该只能在没有数组代理帮助的情况下对数组对象进行排序。我不得不在我用来返回ArrayProxy的变换中进行微小的修改,而不是正常的对象数组,如:

AS.AnalyticsRunParameterTransform = DS.Transform.extend({
//return array of ember objects
deserialize: function (serialized) {
    var objects = [];
    for (var key in serialized) {
        objects.push(Ember.Object.create({
            "name": serialized[key].name,
            "description": serialized[key].description,
            "default": serialized[key]["default"],
            "value": serialized[key].value,
            "category": serialized[key].category
        }));
    }

    //return objects;
    return Ember.ArrayProxy.create({ content: objects });
},
//return JSON object
serialize: function (deserialized) {
    var analyticsTemplate = {}, object;
    for (var i = 0, len = deserialized.length; i < len; i++) {
        object = deserialized[i];
        analyticsTemplate[object.get('name')] = {"name": object.get('name'),
            "description": object.get('description'),
            "default": object.get('default'),
            "value": object.get('value'),
            "category": object.get('category')};
    }
    return analyticsTemplate;
}
});