2

私は多くのスレッドを読みましたが、2 つのオブザーバブル配列を計算し、それらの追加/削除を追跡し、計算されたオブザーバブルを更新する方法について十分な情報がありません。これは、それらに対して既に多くの変更が加えられているにもかかわらず、計算が一度だけ更新され、決して変更されないためです。 2。

ここにJsFiddleがあります

その背後にあるコードは次のとおりです。

var VM = function () {
    var self = this;

    self.first = ko.observableArray([{
        Id: 1,
        name: "john"
    }, {
        Id: 3,
        name: "steve"
    }, {
        Id: 5,
        name: "roger"
    }]);

    self.second = ko.observableArray([{
        Id: 2,
        name: "laker"
    }, {
        Id: 4,
        name: "don"
    }, {
        Id: 6,
        name: "idiot"
    }]);

    self.both = ko.computed(function () {
        return self.first().concat(self.second());
    });

    self.removePerson = function (v) {
        (self.first().indexOf(v) !== -1) ? ko.utils.arrayRemoveItem(self.first(), self.first()[self.first().indexOf(v)]) : ((self.second().indexOf(v) !== -1) ? ko.utils.arrayRemoveItem(self.second(), self.second()[self.second().indexOf(v)]) : console.log("Item doesnt exist"));
    }
}

ko.applyBindings(new VM());

質問

computedまたはを変更するたびに更新するにはどうすればよいですfirstsecond?

4

1 に答える 1

1

計算は問題ありませんが、removePerson正しく動作していません。

そのため、UI で変更を確認しないでください。これを使用ko.utils.arrayRemoveItemすると、基になる配列から項目が削除されるため、KO は変更を認識せず、計算結果を更新しません。

valueHasMutated()計算された変更をトリガーする削除後に配列で を呼び出すように修正する 1 つの方法。(デモ)

または、代わりにmyObservableArray.remove(someItem)メソッド ( docを参照)を使用できます。

self.removePerson = function (v) {
    (self.first().indexOf(v) !== -1) 
    ?  self.first.remove(v) 
    :  self.second.remove(v)
}

JSFiddle のデモ。

于 2013-07-20T18:42:27.227 に答える