2016-07-12 6 views
1

私はいくつかのデータを複数のHTTPリクエストでロードするページを持っています。その後、このページの中のいくつかのディレクティブでいくつかのロジックを実行する必要があります。
私は、このような状況のための最良の方法は何ですか?
今、コンテンツがロードされたことを示すbooleanフラグがあります。最初のアイデアは、これらのディレクティブでタイムアウトを使用してコンテンツがロードされているかどうかを確認し、そうであればこのロジックを実行することでした。
第2のアイデアは放送を利用することでした。私はこのアイデアが気に入っていますが、それらのディレクティブにはクロージャスコープがあるので、私が得る限り、$ rootScopeでブロードキャストする必要があります。そして、私が理解する限り、これは生産性の観点からは最良のアイデアではありません。
このような種類のタスクに最適なソリューションは何かを教えてください。子スコープでコールバックを呼び出す最良の方法は何ですか?

+0

との同期を心配する必要はありません「ネイティブ角度」されています。ディレクティブは '$ rootScope'以外の共通の祖先でカプセル化されていますか?それらがすべて同じコントローラにカプセル化されていれば、 '$ scope。$ broadcast'を実行するだけで同じ効果を持ちますが、現在のスコープの子にしかできません。 –

+0

祖先は同じページのコントローラーのスコープです。しかし、子スコープは階層内でかなり低くなる可能性があります。同様のページにはディレクティブが含まれており、このディレクティブにはこのブロードキャストを聴く別のディレクティブが含まれています。そういうわけで、問題は、ページのスコープでブロードキャストする方が良いか、rootScopeで出すのが良いのでしょうか? – Mikhail

+1

'$ emit'はおそらく加入者に公開するだけなので、行く方法です。 '$ broadcast'はすべての子スコープを通過しなければなりません。 –

答えて

3

$ rootScope.emit()は、angular1の最適なアプローチです。これは

の$ rootscope.emit()のpubsubパターンで構築されている放送がダウンして浸透するので

ちょうど使用しているすべてのスコープがあなたができるコントローラで

$rootScope.$emit('topic'); 

in directive 

$rootScope.$on('topic', function(){}) 
0

を発するブロードキャスト方式として高価ではありませんこれには$q serviceを使用してください。具体的には、 入力約束のすべてが解決されるときに解決される

は、単一の約束に複数の約束を組み合わせ$q.all()方法です。

利点は、それがそうDOMの階層に依存$スコープなど

+0

私はあなたの考えを理解していません。ページのトップレベルスコープでq.all()を使用して、すべてのデータがロードされるタイミングを確認し、 "loaded"フラグをtrueに設定します。しかし、これはどのように私が複数の子ディレクティブでいくつかのロジックを実行するのに役立ちますか?確かに、私はarrayを使って約束をすべて破棄しようとする可能性がありますが、これが最もクリーンな解決策であるとは確信していません。 – Mikhail

+0

ああ..私は参照してください。その場合、@ Piyush.kapoorが提案した '$ rootScope。$ emit'を使用してください –

関連する問題