オブザーバブルから自動的にトリガーせずにビューを強制的に更新する方法は?


151

注:これは主にKnockoutJSをデバッグして理解するためのものです。

(すでにバインドされている)ビューモデルからビューを更新するようにKnockoutに明示的に要求する方法はありますか?私は次のようなものを探しています:

ko.refreshView();

これはKnockoutの使用目的ではないことを理解していますが、デバッグや学習のためにそのような方法があるかどうかを知りたいです。

回答:


252

viewModel全体で何かを呼び出すことはできませんが、個々のオブザーバブルで呼び出してmyObservable.valueHasMutated()、サブスクライバーに再評価する必要があることを通知できます。ご指摘のとおり、これは通常KOでは必要ありません。


5
また、データコンテキストを反復処理してvalueHasMutated、タイプのプロパティを持つ要素を検索し、それぞれのプロパティfunctionに対して呼び出すこともできます。これですべてのオブザーバブルを取得できるはずですが、これは悪い習慣であり、予想よりもはるかに多くの更新を起動します(計算された依存関係チェーンを考えてみてください)。
Patrick M

他に何もない場合は、きっと素晴らしいでしょう-chromeでのテスト。
Scott Romack

viewModel自体が監視可能であるため、を呼び出しmyViewModel.valueHasMutated()てビュー全体を更新できます。
Roy J

2
ここでも配列では機能しません。実際、配列はKnockoutではまったく機能しないようです。Angularが恋しいです:-(
garryp

2
KO 3.5以降のKnockoutObservableArraysでは機能します
balint

25

状況によっては、バインディングを単純に削除してから再適用すると便利な場合があります。

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

編集の称賛に感謝します...私はコーヒースクリプトを使用していると私は言ったでしょうね;-)
ProfNimrod

15
cleanNodeは他のdomイベントも削除するため、jQueryも使用する場合(たとえば、アプリのビットをkoに移行する場合)に注意してください。
Dan Revell

これは完璧です。ビューモデルが適用された後、KOにデータバインド属性を持つ新しいdomの子を認識させることができません。
Andrew T Finnell

パーフェクト!ワーキング!
jeff_drumgod

0

bindHTMLノックアウトバインディングハンドラーでJSFiddleを作成しました:https ://jsfiddle.net/glaivier/9859uq8t/

まず、バインディングハンドラーを独自の(または共通の)ファイルに保存し、Knockoutの後に含めます。

これを使用する場合、バインディングをこれに切り替えます。

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.