Angular 1.5+组件可选单向绑定

时间:2016-12-24 23:05:13

标签: javascript angularjs angular-components

取自AngularJS 1 documentation

  

您还可以通过添加?<?<?attr来使绑定成为可选项。

可选的一个与单向绑定的非可选方法有什么不同?

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

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

2 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:2)

使用<?使得控制器可以更改应该绑定的变量的值,只有当该变量不存在时才会这样。

当控制器不存在时,可以在控制器中修改它们。如果值传递给组件,则无法更改它。

无法修改非可选绑定。如果它们不存在,则为undefined,并且根本无法修改它们。

例如,假设你有这个:

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

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

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

请注意,为简化事物,我们使用的是一个按值传递的字符串。如果要传递对象,则可以在正常条件下修改对象的属性。