知っておくべきことの1つは、$プレフィックスがAngularメソッドを指し、$$プレフィックスが使用を避けるべきAngularメソッドを指すことです。
以下は、テンプレートとそのコントローラーの例です。$ broadcast / $ onを使用して、目的を達成する方法を説明します。
<div ng-controller="FirstCtrl">
<input ng-model="name"/>
<button ng-click="register()">Register </button>
</div>
<div ng-controller="SecondCtrl">
Registered Name: <input ng-model="name"/>
</div>
コントローラは
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
私への質問は、ユーザーが登録をクリックしたときに、2番目のコントローラーに名前をどのように渡すのですか?複数のソリューションを考え出すかもしれませんが、ここで使用するのは$ broadcastと$ onを使用することです。
$ broadcast対$ emit
どちらを使用すればよいですか?$ broadcastはすべての子dom要素にチャネリングし、$ emitはすべての先祖dom要素に逆方向をチャネリングします。
$ emitと$ broadcastのどちらかを決定しないようにする最良の方法は、$ rootScopeからチャネルを作成し、そのすべての子に$ broadcastを使用することです。これは、dom要素が兄弟であるため、ケースがはるかに簡単になります。
$ rootScopeを追加して$ broadcastを許可する
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
$ rootScopeを追加し、今では$ broadcast(broadcastName、arguments)を使用していることに注意してください。broadcastNameについては、2番目のCtrlでその名前をキャッチできるように、一意の名前を付けます。私はブームを選びました!楽しみのためだけに。2番目の引数「引数」を使用すると、リスナーに値を渡すことができます。
放送を受け取る
2番目のコントローラーでは、ブロードキャストをリッスンするようにコードを設定する必要があります
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
とても簡単です。実例
同様の結果を達成する他の方法
この一連のメソッドは、効率的でも保守も容易ではないため、使用しないようにしてください。ただし、これは、発生する可能性のある問題を修正する簡単な方法です。
通常、サービスを使用するか、コントローラーを簡略化することで、同じことを実行できます。これについては詳しく説明しませんが、完全を期すために触れておきます。
最後に、聞くのに本当に役立つブロードキャストは「$ destroy」です。$は、ベンダーコードによって作成されたメソッドまたはオブジェクトであることを意味します。とにかく、$ destroyはコントローラーが破壊されたときにブロードキャストされます。コントローラーが削除されたことを知るためにこれを聞くことができます。