在knockoutjs是对象克隆还是他们引用相同的东西?

时间:2012-10-24 18:57:08

标签: javascript knockout.js clone knockout-2.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.activeProducts和this.allProducts保存为单独的数组。

1 个答案:

答案 0 :(得分:2)

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

来自Knockout documentation

的更多信息
  

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克隆over here