1

循環依存関係を持つビュー モデルがあるとします。通常の状況ではこれを避けるべきであることはわかっていますが、この場合は、自分で制御できないため、できないと想定してください。親と子は相互に参照します。以下は、簡潔にするために非常に単純化された例です。

HTML:

<div id="root">
    <div data-bind="text: parent.childName()"></div>
</div>

JS:

var page = {};

page.parent = 
{ 
    name: ko.observable('parent'), 
    childName: ko.computed(function() { return page.child.name(); })
};
page.child = 
{ 
    name: ko.observable('child'), 
    parentName: ko.computed(function() { return page.parent.name(); })
};

ko.applyBindings(page, document.getElementById('root') );

JSフィドル

問題はko.computed、最初の初期化時に実行されることです。すべての瞬間にのみ実行される場合は、applyBindingsまったく問題ありません。

1 つの解決策は、ko.computed を完全に削除し、単純な通常の関数を使用することです。これらは、applyBindings の時点でのみ実行されます。問題はもちろん、キャッシュ機能などを失うなど、ko.computed の他のすべての利点を失うことです。

計算されたオブザーバブルがそのapplyBindingsフェーズでのみ初期化を開始すると言う方法はありますか?

4

2 に答える 2

4

オプションを使用deferEvaluationして、計算された評価を最初にアクセスしたときまで延期します。

ko.computed({
    read: function() { return page.parent.name(); },
    deferEvaluation: true
});

JSFiddle

于 2014-11-28T14:14:39.033 に答える