[解決済み] AngularJSの.$on()とは?
質問
次のようなコードがあります。
$rootScope.$on('abc',function(event, next, current){ });
をチュートリアルで紹介しました。
私の疑問は
.$on()
? もしそれが関数であるなら、なぜその前に
$
?
解決方法は?
$on
は
$broadcast
と
$emit
- というのは、他の場所からのコードをトリガーする方法です。
については、まず
$on
のメソッドであることを知っておく必要があります。
$scope
次に知っておくべきことは、$プレフィックスはAngularメソッドを指し、$$プレフィックスは使用を避けるべきAngularメソッドを指すということです。
さて、ここで
$on
があります。
以下は、テンプレートとそのコントローラの例です。
$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を使ったものです。
ブロードキャストとエミット
どちらを使うべきでしょうか? ブロードキャストはすべての子dom要素に、$emitはその逆ですべての祖先dom要素にチャンネルダウンします。
emitか$broadcastかの選択を避ける最良の方法は、$rootScopeからチャネルし、そのすべての子に対して$broadcastを使用することです。 これは、dom要素が兄弟であるため、私たちのケースをより簡単にします。
ルートスコープを追加し、$broadcastを使用可能にする
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
rootScopeを追加し、$broadcast(broadcastName, arguments)を使用していることに注意してください。 broadcastNameにはユニークな名前をつけて、secondCtrlでその名前をキャッチできるようにしたい。 ここではお遊びでBOOM!にしてみました。 2つ目の引数'arguments'はリスナーに値を渡せるようにします。
ブロードキャストの受信
2つ目のコントローラでは、ブロードキャストをリッスンするコードをセットアップする必要があります。
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
本当に簡単なことなんです。 ライブの例
同様の結果を得るためのその他の方法
この一連のメソッドは効率的でもメンテナンスが簡単でもないので、なるべく使わないでください。しかし、あなたが抱えている問題を解決するための簡単な方法です。
同じことは、サービスを使うか、コントローラを簡略化することで大抵は実現できます。 これについては詳しく説明しませんが、念のため触れておこうと思います。
最後に、本当に便利なブロードキャストとして「$destroy」を覚えておいてください。 とにかく、$destroyはコントローラが破壊されたときにブロードキャストされます。
関連
-
[解決済み] AngularJs ReferenceError: $http is not defined
-
[解決済み] AngularJS の ng-disabled ディレクティブに式を指定しても動作しない
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] AngularJSのngClassの条件付き
-
[解決済み] 条件に応じて特定のルートにリダイレクトする機能
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 方法 $state.go()
-
[解決済み] ページロード時にAngularJSのコントローラ関数を実行する方法は?
-
[解決済み] Angular JS $locationChangeStart 次の url ルートオブジェクトを取得する
-
[解決済み] AngularJSのディープリンクとは何ですか?
-
[解決済み] ajaxリクエスト時にAngularjsのローディング画面が表示される。
-
[解決済み] AngularJSの「href」と「ng-href」の違いについて
-
[解決済み] angularjsでチャートを作成する【終了】。
-
[解決済み] angularJSの::の意味するところ
-
[解決済み] 入力フィールドにフォーカスを当てるには?
-
[解決済み] AngularJSのng-repeatでキーと値を反復処理する方法は?