0

我有一个 Ember 数组控制器,它绑定到 Ember 选择视图,如果用户愿意,它会由用户进行排序。一旦一切都通过我的排序并且我用现在排序的数组重置数组,视图不会改变,但是如果我循环遍历我刚刚设置的数组,它表明它已排序。所以我相信视图不会用数组控制器更新。我正在查看其他有类似问题的帖子,但他们的解决方案都没有为我工作。

dmp: Ember.ArrayController.create(),
tempArray: new Array(),

sort: function() {
        debugger;
        var self = this;
        var textA, textB, i, t, pos, temp;
        this.set('tempArray',  self.dmp.get('content'));
        var nxt;
        for(t = 0; t < (self.get('tempArray').length) - 1; t++) {
            nxt = this.get('tempArray')[t];
            for(i = t; i < self.get('tempArray').length; i++) {
                if(self.get('tempArray')[i].name.toUpperCase() <= nxt.name.toUpperCase()) {
                    nxt = self.get('tempArray')[i];
                    pos = i;
                }
            }
            temp = self.get('tempArray')[t];
            self.get('tempArray')[t] = nxt;
            self.get('tempArray')[pos] = temp;
        }
        //App.defRouteSearch.dmpName.set('content', self.get('tempArray'));
        //App.defRouteSearch.dmp.set('content', self.get('tempArray'));
        self.setArray();
    }, 

setArray: function() {
        debugger;
        var a = 0, b = 1;
        var self = this;
        while(a < this.get('tempArray').length) {
            self.get('dmp').toArray[b] = self.get('tempArray')[a];
            a++;
            b++;
        }
    }

我将所有内容都切换到一个普通的 js 数组,因为它比数组控制器操作数据更快,我在填充我拥有的其他 6 个数组时在我的其余代码中执行此操作,因此不会造成任何问题。注释代码是我之前设置数组时所做的。谢谢你的帮助。

4

2 回答 2

2

没有必要做这一切。这应该可以解决问题:

App.MyArrayController = Ember.ArrayController.create({
  content: songs,
  sortProperties: ['name'],
  sortAscending: true
});
于 2013-09-20T19:50:14.990 回答
0

一段时间后,我能够让它工作。这是我现在的排序

sortName: function() {
        var self = this;
        var i, t, pos, temp;
        this.set('tempArray', new Array());
        this.set('tempArray',  self.dmp.get('content'));
        var nxt;
        for(t = 0; t < (self.get('tempArray').length) - 1; t++) {
            nxt = this.get('tempArray')[t];
            for(i = t; i < self.get('tempArray').length; i++) {
                if(self.get('tempArray')[i].name.toUpperCase() <= nxt.name.toUpperCase()) {
                    nxt = self.get('tempArray')[i];
                    pos = i;
                }
            }
            temp = self.get('tempArray')[t];
            self.get('tempArray')[t] = nxt;
            self.get('tempArray')[pos] = temp;
        }
        self.dmp.set('content', self.tempArray.clone());
    }, 

Array.prototype.clone = function () {
    var newObj = [];
    for (i in this) {
        if (this[i]) {
            if ($.isPlainObject(this[i])) {
                newObj[i] = $.extend(true, {}, this[i]);
            }
            else if ($.isArray(this[i])) {
                this[i].clone();
            }
            else {
                newObj[i] = this[i];
            }
        }        
    }
    return newObj;
};

我不完全确定它为什么有效,但确实有效。我能想出的一点点推理是,在 js 中,当你复制一个数组时,它只是被引用而不是实际复制。但是由于引用的数组已被修改,所以我不应该在最后需要 clone() 。如果我错了,请随时纠正我。

于 2013-09-24T20:41:09.370 回答