【问题标题】:Copy items from observablearray to another observablearray将项目从 observablearray 复制到另一个 observablearray
【发布时间】:2026-01-10 05:10:01
【问题描述】:

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

玛丽

如何解决? 谢谢

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    Knockout 仍将跟踪依赖关系,因为它仍然是一个在 observableArray 中引用的数组。在执行 array2(array1()) 时,两个 observable 仍然引用同一个对象。

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

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

    fiddle

    另外,KnockoutJS 使用自己的 slice 方法填充 observableArrays,您可以调用它

    array2(array1.slice());
    

    来自文档:

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

    【讨论】:

    • 你对深度复制有什么见解吗?也就是说,通过值而不是通过引用复制可观察数组中的可观察对象?
    【解决方案2】:

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

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

    【讨论】:

      最近更新 更多