Angular 1.5+组件可选单向绑定

Angular 1.5+ component optional one-way binding

摘自 AngularJS 1 documentation:

You can also make the binding optional by adding ? : <? or <?attr.

对于单向绑定,可选的与非可选的有何不同?

我似乎可以在我的 fiddle 上找出可选版本的双向 (=) 和委托 (&) 绑定的区别:https://jsfiddle.net/glenn/ze2wo0s1/,但不是单向的。

顺便说一句,圣诞快乐! ❤️

您可以在源代码中查看它的处理方式:https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L3523

对我来说,如果您使用 <? 并将绑定设为可选,它会提前中断而无需设置手表。如果使用 use < 并将其设为必需,它会将绑定设置为 undefined 并设置监视。但是,它似乎只是在监视 undefined,所以在实践中,除了对 recordChanges 的一次调用外,没有任何区别。如果您省略了必需的绑定,则必需的绑定将是 changes 对象中的一个键,该对象在第一次调用时传递给 $onChanges 挂钩。但是,当您省略可选绑定时,它将不是 changes 对象中的键。

有关示例,请参阅此 JSFiddlerequiredBindingoptionalBinding 都被省略,因此被初始化为 undefined,但是 requiredBindingchange 对象上的键,而 optionalBinding不是。

使用 <? 可以让控制器更改应该绑定的变量的值,前提是该变量不存在。

当可选绑定不存在时,可以在控制器中对其进行修改。如果该值已传递给组件,则无法更改它。

非可选绑定无法进行任何修改。如果不存在,则为undefined,根本无法修改。

例如,假设您有这个:

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

在控制器中,您不能简单地$ctrl.nameRequired = 'something else'并期望视图得到更新。但是,您 可以 nameOptional 执行相同的操作,但有一个条件:仅当 name-optional 未传递给组件时。只有这样变量才是控制器要改变的。

为了更好地理解您可以参考this fiddle

请注意,为了简化操作,我们使用按值传递的字符串。如果您正在传递对象,则对象的属性在正常情况下始终可以被修改。