web-dev-qa-db-ja.com

Angular 1.5+コンポーネントのオプションの一方向バインディング

AngularJS 1から取得 ドキュメント

?<?または<?attrを追加して、バインディングをオプションにすることもできます。

オプションのものは、一方向バインディングの非オプションのものとどのように異なりますか?

オプションバージョンの双方向(=)バインディングとデリゲート(&)バインディングの違いを、ここで私のフィドルで理解しているように見えます: https://jsfiddle.net/ glenn/ze2wo0s1 / ですが、一方向のものではありません。

ちなみに、とてもメリークリスマス! ????????????❤️

11
Glenn Mohammad

ソースコードでどのように処理されるかを確認できます: https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L352

私には、<?を使用してバインディングをオプションにすると、時計を設定しなくても早期に壊れてしまうように見えます。 use <を使用してそれを必須にすると、バインディングがundefinedに設定され、ウォッチがセットアップされます。ただし、undefinedを監視しているように見えるため、実際には、recordChangesへの1回の呼び出しを除いてまったく違いはありません。必要なバインディングを省略した場合、必要なバインディングは、最初の呼び出しで$onChangesフックに渡されるchangesオブジェクトのキーになります。ただし、オプションのバインディングを省略すると、それはchangesオブジェクトのキーにはなりません。

例については、これを参照してください JSFiddlerequiredBindingoptionalBindingは両方とも省略されているため、undefinedに初期化されますが、requiredBindingchangeオブジェクトのキーです。 optionalBindingはそうではありません。

15
ppham27

<?を使用すると、その変数が存在しない場合にのみ、コントローラーがバインドされるはずの変数の値を変更できるようになります。

オプションのバインディングは、存在しない場合はコントローラーで変更できます。値がコンポーネントに渡された場合、それを変更する方法はありません。

オプションではないバインディングは、変更できません。それらが存在しない場合、それらはundefinedであり、まったく変更できません。

たとえば、次のようになっているとします。

bindings: {
  nameOptional: '<?',
  nameRequired: '<'
}

コントローラでは、できません単に$ctrl.nameRequired = 'something else'を実行して、ビューが更新されることを期待します。ただし、canは、name-optionalがコンポーネントに渡されない場合にのみ1つの条件でnameOptionalを使用して同じことを行うことができます。その場合にのみ、変数は変更するコントローラーです。

理解を深めるために、 このフィドル を参照してください。

簡単にするために、値で渡される文字列を使用していることに注意してください。オブジェクトを渡す場合、オブジェクトのプロパティは通常の状態でいつでも変更できます。

2
Aᴍɪʀ