0

ユーザーが選択した場合にソートされる Ember 選択ビューにバインドされた Ember Array Controller があります。すべてがソートされ、ソートされた配列で配列をリセットすると、ビューは変更されませんが、設定した配列をループすると、ソートされていることが示されます。したがって、ビューはアレイコントローラーで更新されていないと思います。同様の問題を抱えた他の投稿を見ていましたが、それらの解決策はどれもうまくいきませんでした。

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

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 に答える