この質問はすでに打ちのめされていますが、他の誰かがAngularJSスコープである恐ろしい混乱に苦しんでいる場合に備えて、とにかくこれを共有します。これは、、、、およびをカバー=
します。完全な書き込みはここで見つけることができます。 <
@
&
::
=
双方向バインディングを確立します。親のプロパティを変更すると、子も変更されます。その逆も同様です。
<
親から子への一方向のバインディングを確立します。親のプロパティを変更すると子も変更されますが、子のプロパティを変更しても親のプロパティには影響しません。
@
タグ属性の文字列値を子プロパティに割り当てます。属性に式が含まれている場合、式が別の文字列に評価されるたびに子プロパティが更新されます。例えば:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
ここでdescription
、子スコープのプロパティは式の現在の値になります"The movie title is {{$ctrl.movie.title}}"
。ここmovie
で、は親スコープのオブジェクトです。
&
少し注意が必要です。実際、これを使用する理由はないようです。これにより、親スコープの式を評価し、パラメーターを子スコープの変数に置き換えることができます。例(plunk):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
が与えられるparentVar=10
と、式parentFoo({myVar:5, myOtherVar:'xyz'})
はに評価され5 + 10 + 'xyz'
、コンポーネントは次のようにレンダリングされます。
<div>15xyz</div>
この複雑な機能をいつ使用したいと思いますか?&
親スコープのコールバック関数を子スコープに渡すためによく使用されます。ただし、実際には、「<」を使用して関数を渡すことで同じ効果を得ることができます。これは、より簡単で、パラメーター()を渡すための厄介な中括弧構文を回避します{myVar:5, myOtherVar:'xyz'}
。検討:
を使用したコールバック&
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
を使用したコールバック<
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
オブジェクト(および配列)は、コピーではなく、子スコープへの参照によって渡されることに注意してください。これが意味するのは、それが一方向のバインディングであっても、親スコープと子スコープの両方で同じオブジェクトを操作しているということです。
動作中のさまざまなプレフィックスを確認するには、このプランクを開きます。
を使用したワンタイムバインディング(初期化)
::
[公式ドキュメント]
AngularJSの新しいバージョンでは、子スコープのプロパティが1回だけ更新される1回限りのバインディングを持つオプションが導入されています。これにより、親プロパティを監視する必要がなくなるため、パフォーマンスが向上します。構文は上記とは異なります。ワンタイムバインディングを宣言するには、コンポーネントタグ::
の式の前に次のように追加します。
<child-component
tagline = "::$ctrl.tagline">
</child-component>
tagline
これにより、一方向または双方向のバインディングを確立せずに、の値が子スコープに伝播されます。注:tagline
が最初undefined
に親スコープにある場合、angularは変更されるまでそれを監視し、子スコープの対応するプロパティを1回更新します。
概要
次の表は、プロパティがオブジェクト、配列、文字列などであるかどうかに応じてプレフィックスがどのように機能するかを示しています。