13

私は2つのobservablearrayを持っています。observablearray1 から observablearray2 に項目をコピーし、observablearray2 の値を変更すると、observablearray1 も変更されます。

var viewModel = (function() {
    var
        array1 = ko.observableArray(['John', 'Joe', 'Jim']),
        array2 = ko.observableArray();

    // copy
    array2(array1());
    array2()[2] = 'Mary';
    return {
        array1: array1,
        array2: array2
    }

})();

ko.applyBindings(viewModel);

console.log(viewModel.array1());
console.log(viewModel.array2());

http://jsfiddle.net/xveEP/69/

結果:
配列 1
John
Joe
Mary
配列 2
John
Joe
Mary

修正方法は?ありがとう

4

2 に答える 2

21

Knockout は依然としてobservableArray. を実行するarray2(array1())と、2 つのオブザーバブルは引き続き同じオブジェクトを参照します。

代わりに配列のコピーを渡します (要素を明示的にコピーする必要はありません)。

array2(array1().slice(0));

フィドル

または、KnockoutJS は observableArrays を独自のスライス メソッドでシムし、それを呼び出すことができます。

array2(array1.slice());

ドキュメントから:

slice - スライス関数は、ネイティブ JavaScript スライス関数と同等の observableArray です (つまり、指定された開始インデックスから指定された終了インデックスまでの配列のエントリを返します)。myObservableArray.slice(...) を呼び出すことは、基になる配列 (つまり、myObservableArray().slice(...)) で同じメソッドを呼び出すことと同じです。

于 2013-10-12T21:22:15.787 に答える
1

配列自体ではなく、配列の要素をコピーします。

// copy
for (var i = 0; i < array1().length; i++) {
    array2().push(array1()[i]);
}
于 2013-10-12T21:16:14.350 に答える