2013-01-31 17 views
12

ダイジェストサイクルからスコープを削除する方法はありますか?言い換えれば、スコープダイジェストサイクルを中断/再開するには?ダイジェストサイクルからスコープを削除して復元する

私の場合、すべてのページが既に読み込まれていますが、すべてが表示されているわけではありません。だから私は無駄な処理を避けるために見えないものを中断したいと思う。私はng-view + $routeを使用したくない、私はディープリンクしたくない/必要がない。

私はthis threadを見て、this fiddleに到着しました。それはおそらく仕事をしますが、それはかなり侵略的であり、あまりフレームワークではありません。

$scope.suspend()scope.resume()のような解決策はありますか?あるいは、侵略的ではない(フレームワークの観点から)?私は現在、$destroy$compileサイクルを考えています。

答えて

3

今日のフレームワークは、スコープのダイジェストを中断/再開する方法はありません。これを言って、ダイジェストサイクルの一部として実行されるウォッチの数を制限するために使用できるいくつかのテクニックがあります。

まず、画面の一部が隠れている場合は、ng-switchディレクティブファミリを使用して、不可視部品をDOMから完全に削除することができます。

第二に、ダイジェストサイクルが$applyを経由してあなたのディレクティブからトリガされ、あなたが子供に再評価の時計を制限したいされている場合は、あなたが$digest代わりの$applyを呼び出すことができますスコープ。

次に、リンクしているディスカッションの説明に従って、スコープを破棄して再作成できます。しかし、すでにDOMの一部を隠している場合は、ng-switchのように聞こえる場合があります。

+0

この使用例では、実際には 'ng-switch'を使用することはかなりのオプションです。しかし、非角コードを使用している人が、 'ng-switch'が操作を制御せずに、DOMの特定の部分の更新を中断したいと思っているのは妥当だと思いませんか?私たちは確かに 'ng-switch'の動作を模倣することができましたが、これは大きなハイブリッドプロジェクトのパフォーマンスチューニングにとって重要な機能です。さらに、 'ng-bind'時計が実行されないようにする方法かもしれません。分かりません...あなたの考えを共有してください。 –

12

私は同じ問題に遭遇しましたが、私はAngularJSに(あまりにも)干渉しない興味深い解決策を見つけました。無効にするスコープにこれを追加します。

var watchers; 

scope.$on('suspend', function() { 
    watchers = scope.$$watchers; 
    scope.$$watchers = []; 
}); 

scope.$on('resume', function() { 
    scope.$$watchers = watchers; 
    watchers = null; 
}); 

その後、あなたとスコープとその子を無効にすることができます:scope.$broadcast('suspend')scope.$broadcast('resume')でそれを持ち帰ります。

+0

素敵なトリック。これは確かにトリックを行うだろうが、バージョンをアップグレードするのが難しくなるので、私はハックを好きではない。とにかく、誰かがこのアプローチを使用するならば、無効になっている間に新しいウォッチャーが追加されるかもしれないので、オーバーライド '$ scope。$ watch'もオーバーライドするのが良いでしょう。 –

+0

私はちょうどこのテクニックについての短い記事を投稿しました:https://coderwall.com/p/d_aisq –

+0

これはちょうど表示されていないnon-performantテーブルを持っていたアプリケーションで私を保存しました。長い解決策は、ソート可能なテーブルを改ページして無限のスクロールを作成することです...しかし、これは歩き回ることができますので、今はもっと重要な機能に集中することができます。いいね技術的な借金を! – FlavorScape

関連する問題