この質問はすでに打ちのめされていますが、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: '<'
}
});
オブジェクト(および配列)は参照によって子スコープに渡され、コピーされないことに注意してください。つまり、一方向のバインドであっても、親スコープと子スコープの両方で同じオブジェクトを操作しているということです。
実際のさまざまなプレフィックスを確認するには、このplunkを開きます。
を使用した1回限りのバインディング(初期化)
::
[公式ドキュメント]
AngularJSの新しいバージョンでは、子スコーププロパティが1回だけ更新される1回限りのバインディングを持つオプションが導入されています。これにより、親プロパティを監視する必要がなくなるため、パフォーマンスが向上します。構文は上記とは異なります。ワンタイムバインディングを宣言するに::
は、コンポーネントタグの式の前に追加します。
<child-component
tagline = "::$ctrl.tagline">
</child-component>
これは、tagline
一方向または双方向のバインディングを確立せずに、値を子スコープに伝播します。注:tagline
が最初undefined
に親スコープ内にある場合、angularはそれが変更されるまで監視し、子スコープ内の対応するプロパティを一度更新します。
概要
次の表は、プロパティがオブジェクト、配列、文字列などであるかどうかに応じて、プレフィックスがどのように機能するかを示しています。