题 将项目从observablearray复制到另一个observablearray


我有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
约翰

玛丽
阵列2
约翰

玛丽

怎么解决? 谢谢


12
2017-10-12 21:03


起源




答案:


Knockout仍然会跟踪依赖项,因为它仍然是一个带有引用的数组 observableArray。做的时候 array2(array1()) ,这两个可观察者仍然引用同一个对象。

传递数组的副本(不需要显式复制元素)。

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

小提琴

或者,KnockoutJS使用自己的切片方法填充observableArrays,您可以调用它

array2(array1.slice());

来自文档:

slice - slice函数是与本机JavaScript切片函数等效的observableArray(即,它将给定的起始索引中的数组条目返回到给定的结束索引)。调用myObservableArray.slice(...)等效于在底层数组上调用相同的方法(即myObservableArray()。slice(...))。


21
2017-10-12 21:22



你对深度复制有什么见解吗?也就是说,通过值而不是通过引用复制可观察数组中的可观察对象? - PrinceTyke


复制数组的元素而不是数组本身:

// copy
for (var i = 0; i < array1().length; i++) {
    array2().push(array1()[i]);
}

0
2017-10-12 21:16