0

我在早期版本的淘汰赛中构建了一个应用程序,代码如下所示:

    var ProductCollection = function(products, metadata) {
        var self = this;
        this.allProducts = products;
        this.activeProducts = ko.observableArray(products);

然后,如果我从 activeProduct 数组中过滤掉项目,例如:

    this.activeProducts.remove(function(item) { //some code })

我可以通过执行以下操作将 activeProducts 重置为所有产品:

    this.activeProducts(this.allProducts);

但是现在看来,如果我在从 this.allProducts 中删除产品的上方执行删除功能...我要传入的产品并设置链接到相同的引用还是什么?我不明白为什么这会发生在现在而不是以前。我希望能够将 this.activeProducts 和 this.allProducts 保留为单独的数组。

4

1 回答 1

2

正如您的实验所示,ko.observableArray()只需包装底层数组。它不会克隆底层数组,然后创建一个新实例。

以下是来自Knockout 文档的更多内容:

observableArray 跟踪数组中的对象...

observableArray 只跟踪它持有的对象,并在添加或删除对象时通知侦听器......

...您可以通过将 observableArray 作为不带参数的函数调用来获取底层 JavaScript 数组...

从技术上讲,您可以使用任何本机 JavaScript 数组函数来操作该底层数组...


// Thanks @RP Niemeyer
this.activeProducts = ko.observableArray(products.slice(0));

// Deep copy with jQuery
this.activeProducts = ko.observableArray(jQuery.extend(true, {}, products));

此外,如果您真的很好奇,这里有一整个问题专门用于 Javascript克隆

于 2012-10-24T19:49:45.770 回答