1

したがって、この質問は私の前の質問の続きですどのような条件の下でノックアウト ネイティブ テンプレートが再レンダリングされますか

調査の結果、テンプレートがafterRender関数を定義し、そのafterRender関数がパーツ モデルを参照している場合、モデルのその部分が後で変更されると、afterRender関数が再度呼び出されるようです。

この動作は、ノックアウトが依存するモデルの部分を追跡し、依存する値の 1 つが変更されるたびに を再実行するcomputedObservables(別名) に似ているようです。dependentObservablescomputedObservables

これを実証するために、私は jsFiddle を作成しました: http://jsfiddle.net/unklefolk/nczCt/1/

予想どおり、ビューがレンダリングされるときに afterRender 関数が呼び出されます。ただし、チェックボックスをクリックすると、afterRender 関数が再実行されます。viewModel.selectedPet().pet().IsHappy()

これは私には意味がありません。だから私の質問は:

  • afterRender関数が再実行されているのはバグですか?
  • afterRender関数が 1 回だけ実行されるようにするにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

3

Knockoutは、計算されたobservableを使用して、要素のバインディングの実行をラップします。これは、依存関係が変更されたときにバインディングが再度トリガーされる方法です(このリンクはさらに説明するのに役立つ場合があります。

現在、afterRenderコードはこれらの依存関係への追加から除外されていません。これがシナリオにとって望ましくない場合は、それを防ぐ方法がいくつかあります。

  • http://jsfiddle.net/rniemeyer/nczCt/2/setTimeoutのような:でコードを実行します
  • http://jsfiddle.net/rniemeyer/nczCt/3/のようにすぐに破棄できる独自の計算されたオブザーバブルでコードをラップします (setTimeoutを回避するために今のところこれを行います)
  • KO 2.2peekでは、依存関係を作成せずに値を取得できるオブザーバブルで新しい関数を使用できるようになります。
于 2012-08-03T13:33:39.507 に答える