2014-01-15 4 views
19

ダイジェストを延期するか、遅らせる方法はありますか?

私はモデルに加えたい変更がたくさんありますが、モデルへのすべての変更が行われるまではダイジェストを起動したくありません。モデル上のオブジェクトの中には、変更するモデル上の他のオブジェクトを更新するウォッチャーがあります。

理想的には私は$モデルに対するすべての変更

  • スタートは$ $ダイジェストがすべてのダーティオブジェクトを検索します
  • ダイジェストください

  • ダイジェスト停止
    • したいのですがウォッチャーを撃ってください。

      これに対する別の解決策ではなく、

    • が削除されたウォッチャーを追加します(まだ実行さダイジェスト)私は

      • モデルに対するすべての変更を行いウォッチャーを削除することができダイジェスト$停止するのにあります

      ウォッチャを追加した後、モデルが正しい状態になっていることを確認するためにウォッチャメソッドを実行する必要があります。

      2番目のオプションがハックのように思えるだけです。

      アイデア??

  • +2

    "$ digestはすべての汚れたオブジェクトを見つけ、ウォッチャーを起動します。" - 解決策は$ watchを設定して変更を適切に 'if(newVal ...){// do something'を処理することです。あなたのアーキテクチャーが良ければ、 '$ digest'を止めたくないでしょう。それはあなたの友人です! – m59

    +1

    これは有効な質問だと思います。 $ scope変数の値を変更するインスタンスがあり、更新されたバージョンは表示されません。 $ scope。$ apply()と言うと、すでにダイジェストが進行中であると不平を言います。 –

    +0

    ウォッチャーを停止およびクリアするためのサンプルコードを以下に示します。 - https://stackoverflow.com/questions/38381808/how-to-stop-digest-cycle-manually-in-angularjs – Plankton

    答えて

    13

    これはまったくハックではありません。大きなデータセットは、ユーザがテキストを素早く入力したり、バックスペースを保持したりするときに、$ダイジェストサイクルが非常にゆっくりと実行されるため、良い質問です。 performance tweaksは、$watch$filterの機能には注意が必要ですが、debounce functionを使用して$digestサイクルを遅らせることをお勧めします。