我在淘汰赛的早期版本中构建了一个应用程序,代码看起来像:
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保存为单独的数组。
答案 0 :(得分:2)
正如您的实验所示,ko.observableArray()
只是包装了底层数组。它不克隆底层数组,然后创建一个新实例。
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。