親ビューモデルにobservableArray
依存するノックアウト.js子ビューモデルがあります。observable
親はドロップダウンにobservable
バインドされており、子はその値がいつ変更されたかを知る必要があります。select
親ビュー モデル全体を だけに渡し、子を「手動で」更新するためにobservable
、親の内部を にサブスクライブしました。observable
これらはすべて拘束力のある目的で機能します。
問題は、その後、子をクリアしてobservableArray
新しい子用のスペースを空けるか、単純に子を新しい子に置き換えると、knockout.js によって設定された逆方向の依存関係によってまだ参照されているため、古い子がメモリ内に残ることです。
私は、別の設計パターン、またはノックアウトに依存関係の保持を停止するように指示する方法のいずれかに対してオープンです。別の例では、cleanNode() を試しましたが、これらの逆依存関係はクリーンアップされていないようです。
コード:
function FamilyViewModel(name) {
this.name = name;
this.children = ko.observableArray();
}
function ChildViewModel(firstName, lastName, selectedFamilyObservable) {
this.firstName = ko.observable(firstName);
this.lastName = ko.observable(lastName);
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
this.isSelected = ko.computed(function() {
return selectedFamilyObservable().name == this.lastName();
}, this);
}
function PageViewModel() {
this.families = ko.observableArray([
new FamilyViewModel("Smith"),
new FamilyViewModel("Jones"),
new FamilyViewModel("Brown")
]);
this.selectedFamily = ko.observable();
this.addChild = _.bind(function() {
this.selectedFamily().children.push(new ChildViewModel("Frank", this.selectedFamily().name, this.selectedFamily));
}, this);
this.resetChildren = _.bind(function() {
this.selectedFamily().children([]);
}, this);
}
$(function() {
ko.applyBindings(new PageViewModel());
});
フィドル: