[解決済み] AngularJS : ディレクティブのスコープで=と@の違い?重複
質問
を作成する スコープを分離する ディレクティブの中で 外部スコープ を インナースコープ . 属性にマッピングする方法を6種類見てきました。
- =attr
- &attr
- 属性
- =
- &
- @
これらのスコープマッピングの各オプションは何をするのでしょうか?
どのように解決するのですか?
これは混乱しがちですが、簡単な例で明らかになることを期待します。まず、モデルバインディングとビヘイビアを分離しましょう。
ここに、物事を結びつけるのに役立つフィドルがあります。 http://jsfiddle.net/jeremylikness/3pvte/
と説明されています......あなたのディレクティブがこのようなものである場合。
<my-directive target="foo"/>
そうすると、スコープとして以下のような可能性があります。
{ target : '=' }
これは、scope.target (ディレクティブ) を $scope.foo (外部スコープ) に束縛することになります。これは、=が双方向バインディングのためのもので、何も指定しない場合は、内側のスコープ上の名前とディレクティブ上の属性名を自動的にマッチングさせるためです。scope.targetを変更すると、$scope.fooが更新されます。
{ bar : '=target' }
これは、scope.bar を $scope.foo に束縛します。これは、再び双方向バインディングを指定していますが、ディレクティブに "target" 属性にあるものが内側のスコープに "bar" として現れるように指示しているためです。scope.bar を変更すると、$scope.foo が更新されます。
{ target : '@' }
これは、scope.target を "foo" に設定します。@ は "take it literally." を意味するので、scope.target への変更はディレクティブの外には伝わりません。
{ bar : '@target' }
これは、scope.bar を "foo" に設定します。@ は target 属性から値を取るからです。scope.barの変更はディレクティブの外には伝わりません。
では、動作について説明します。外側のスコープがこれを持っていると仮定しましょう。
$scope.foo = function(parm1, parm2) { console.log(parm1 + ": " + parm2); }
これには、いくつかのアクセス方法があります。もしあなたのHTMLが
<my-directive target='foo'>
次に
{ target : '=' }
ディレクティブから scope.target(1,2) を呼び出すことができるようになります。
同じことです。
{ bar : '=target' }
ディレクティブから scope.bar(1,2) を呼び出すことを可能にします。
より一般的な方法は、これを動作として確立することです。技術的には、アンパサンドは親のコンテキストで式を評価します。これは重要なことです。だから、私は持つことができました。
<my-directive target="a+b" />
そして、親スコープが $scope.a = 1 と $scope.b = 2 である場合、私のディレクティブに。
{ target: '&' }
scope.target()を呼び出すと、結果は3になりますね。これは重要なことです。バインディングは内側のスコープに関数として公開されますが、ディレクティブは式にバインドすることができるのです。
もっと一般的な方法としては
<my-directive target="foo(val1,val2)">
なら、使える。
{ target: '&' }
そしてディレクティブから呼び出す。
scope.target({val1: 1, val2: 2});
これは渡されたオブジェクトを受け取り、プロパティを評価された式のパラメータにマップし、それからビヘイビアを呼び出します。この場合は $scope.foo(1,2) を呼び出します。
こんなこともできます。
<my-directive target="foo(1, val)"/>
これは最初のパラメータをリテラル 1 に、そしてディレクティブからロックします。
{ bar: '&target' }
では
scope.bar(5)
これは$scope.foo(1,5)を呼び出すことになります。
関連
-
[解決済み] AngularJSで$httpリクエスト中にスピナーGIFを表示する?
-
[解決済み] Apigee API へのリクエストで 401 レスポンスエラーが発生する
-
[解決済み] AngularJS 。scope.apply()呼び出し時の$digest already in progressエラーを防ぐ。
-
angularjs統合ueditor入門
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み] 子コントローラから親スコープにアクセスする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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのシンプルな "Hello, world "が動作しない。
-
[解決済み] ag-gridの行の追加/削除
-
[解決済み] angularjsでチャートを作成する【終了】。
-
[解決済み] createspyとcreatespyobjの違いは何ですか?
-
AngularJSのベストプラクティス。ng-repeatの$indexに注意する。
-
[解決済み] Angularjsを使用してローカルストレージにデータを保存するにはどうすればよいですか?
-
[解決済み] AngularJSとHandlebars - 両方必要なのかどうか
-
[解決済み] カスタムディレクティブの中で評価された属性を取得する方法
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み] カスタムディレクティブのスコープバインディングで記号 '@', '&', '=', '>' を使用する。AngularJS