114

AngularJS の基本的な情報を見つけようとしましたが$rootScope.$broadcast、AngularJS のドキュメントはあまり役に立ちません。簡単に言えば、なぜこれを使用するのでしょうか。

また、John Papa のホット タオルテンプレート内には、次の名前の共通モジュールにカスタム関数があります$broadcast

function $broadcast() {
    return $rootScope.$broadcast.apply($rootScope, arguments);
}

これが何をしているのか理解できませんでした。したがって、ここにいくつかの基本的な質問があります。

1) 何をし$rootScope.$broadcastますか?

$rootScope.$broadcast2)との違いは何$rootScope.$broadcast.applyですか?

4

5 に答える 5

106
  1. 何をし$rootScope.$broadcastますか?

    $rootScope.$broadcastアプリケーションスコープを介してイベントを送信しています。そのアプリの子スコープは、単純なを使用してそれをキャッチできます: $scope.$on().

    直接の親ではないスコープ (たとえば、親のブランチ) に到達したい場合に、イベントを送信すると特に便利です。

    !!! ただし、してはいけないことの 1 つは$rootScope.$on、コントローラーから使用することです。$rootScopeコントローラーが破棄されても、そのイベントリスナーはまだ存在し、コントローラーが再度作成されると、さらに多くのイベントリスナーが積み上げられます。(したがって、1 つのブロードキャストが複数回キャッチされます)。代わりに使用$scope.$on()すると、リスナーも破棄されます。

  2. と はどう違い$rootScope.$broadcastます$rootScope.$broadcast.applyか?

    apply()特にディレクティブや他の JS ライブラリを操作する場合は、 を使用する必要がある場合があります。しかし、私はそのコードベースを知らないので、ここに当てはまるかどうかはわかりません.

于 2015-04-17T04:16:20.543 に答える
33

$rootScope.$broadcastは、すべての子スコープがリッスンできる「グローバル」イベントを発生させる便利な方法です。$rootScopeすべての子孫スコープがリッスンできるため、メッセージをブロードキャストする ためにのみ使用する必要があります。

ルート スコープはイベントをブロードキャストします。

$rootScope.$broadcast("myEvent");

任意の子 Scope がイベントをリッスンできます。

$scope.$on("myEvent",function () {console.log('my event occurred');} );

$rootScope.$broadcast を使用する理由 を使用$watchして、変数の変更をリッスンし、変数の状態が変更されたときに関数を実行できます。ただし、場合によっては、スコープ変数の状態の変化に関係なく、アプリケーションの他の部分がリッスンできるイベントを発生させたいだけです。こんな時$broadcastに役立ちます。

于 2014-12-22T20:02:02.117 に答える
24

データを渡します!!!

$broadcast渡すことができるパラメーターを受け入れることについて誰も言及していないのはなぜだろうかObject

例:

// the object to transfert
var obj = {
    status : 10
}

$rootScope.$broadcast('status_updated', obj);
$scope.$on('status_updated', function(event, obj){
    console.log(obj.status); // 10
})
于 2016-11-08T12:10:32.783 に答える
8

$rootScope.$broadcast は何をしますか?

メッセージをAngularアプリ全体のそれぞれのリスナーにブロードキャストします。これは、メッセージを異なる階層レベル(親、子、または兄弟)のスコープに転送する非常に強力な手段です。

同様に、$rootScope.$emit があります。唯一の違いは、前者は $scope.$on によってもキャッチされるのに対し、後者は $rootScope.$on によってのみキャッチされることです。

例を参照してください:- http://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

于 2014-11-05T10:13:36.417 に答える