我有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());
结果:
阵列1
约翰
乔
玛丽
阵列2
约翰
乔
玛丽
如何解决? 感谢
答案 0 :(得分:21)
Knockout仍然会跟踪依赖项,因为它仍然是一个带有observableArray
引用的数组。在执行array2(array1())
时,两个可观察对象仍然引用相同的对象。
传递数组的副本(无需显式复制元素)。
array2(array1().slice(0));
或者,KnockoutJS使用自己的切片方法来修改observableArrays,你可以调用它
array2(array1.slice());
来自文档:
slice - slice函数是与本机JavaScript切片函数等效的observableArray(即,它从给定的起始索引返回数组的条目,直到给定的结束索引)。调用myObservableArray.slice(...)相当于在底层数组上调用相同的方法(即myObservableArray()。slice(...))。
答案 1 :(得分:0)
复制数组的元素而不是数组本身:
// copy
for (var i = 0; i < array1().length; i++) {
array2().push(array1()[i]);
}