web-dev-qa-db-ja.com

Angularjspubsubと$ broadcast

私はAngularjsでのイベントの受け渡しについて読んでいますが、$ broadcastを使用するのが良い考えだとは確信していません。

このようなブログ one 「やり過ぎのように感じた」にもかかわらず、$ onに慣れるのを提唱しています。

私の混乱は、実装がスコープの深さ優先トラバーサルを使用し、サブスクライバーを探すことです。これにより、イベントの速度がツリー構造に依存するようになります。これがAngularのコードです。

// Insanity Warning: scope depth-first traversal
// yes, this code is a bit crazy, but it works and we have tests to prove it!
// this piece should be kept in sync with the traversal in $digest
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
   while(current !== target && !(next = current.$$nextSibling)) {
     current = current.$parent;
   }
}

さらに、これらの方法を使用して依存性注入をハックできるようです。

別の方法は、イベントタイプとコールバックをキャッシュし、それらを直接呼び出すサービスです。これには、リークを回避するためにサブスクリプションをクリーンアップする必要があります。

私の質問は、$ Broadcast/$ onパラダイムの動機について私が見逃していることはありますか?または、従来のpubsubよりも使用する利点はありますか?

私の質問が十分に明確でない場合はお知らせください。お時間をいただきありがとうございます。

32
hassassin

私はあなたが何かを逃しているとは思わない。これで、各アプローチの長所と短所の概要がわかりました。

$broadcast/$onアプローチでは、サブスクライブを解除する必要はありませんが、すべてのスコープにブロードキャストするため、それほど効率的ではありません。また、参入障壁が非常に低くなっています。サービスを注入する必要はなく、サービスを作成する必要もありません。彼らは皆に放送するので、それはより単純なアプローチです。

Pub/subアプローチははるかに直接的です。サブスクライバーのみがイベントを取得するため、システム内のすべてのスコープでイベントを機能させるわけではありません。ただし、コールバックハンドラーを使用してサービスを作成する必要があり、購読を解除することを忘れないようにする必要があるため、より複雑になります。私の意見では、退会することを覚えていることはかなり大きなことです。これを正しく行わないと、メモリリークが発生します。そして、それが3ヶ月で問題になるまであなたはそれを知りません。

組み込みのアプローチが$broadcastである理由がわかります。

18
Brian Genisio

私はこれと同じ問題を見ていました。特に、$ rootScopeにアクセスせずにサービスがイベントをブロードキャストおよびサブスクライブできるようにする方法(いくつかの理由で悪い)。ここから非常に優れたjs-signals実装を利用しました: http://millermedeiros.github.io/js-signals/ そしてそれをangularサービスにラップしました。

githubの要点はこちら: https://Gist.github.com/anonymous/b552c7fafa77427e6d06

2
rushkeldon