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 に答える