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())时,两个可观察对象仍然引用同一个对象。

而是传递数组的副本(无需显式复制元素)。

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

小提琴

或者,KnockoutJS 用他们自己的 slice 方法填充 observableArrays,你可以调用它

array2(array1.slice());

从文档:

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 回答