取自AngularJS 1 documentation:
您还可以通过添加
?
:<?
或<?attr
来使绑定成为可选项。
可选的一个与单向绑定的非可选方法有什么不同?
我似乎可以在我的小提琴上找出可选版本的双向(=
)和委托(&
)绑定的差异:https://jsfiddle.net/glenn/ze2wo0s1/,但不是单向的。
答案 0 :(得分:15)
您可以在源代码中看到它的处理方式:https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L3523。
对我来说,看起来如果你使用<?
并使绑定成为可选的,它会在没有设置监视的情况下提前中断。如果使用<
并使其成为必需,则会将绑定设置为undefined
并设置监视。但是,它似乎只是在观察undefined
,所以在实践中,除了对recordChanges
的一次调用之外,没有任何区别。在省略所需绑定的情况下,所需的绑定将是changes
对象中的一个键,该对象在第一次调用时传递给$onChanges
挂钩。但是,当您省略可选绑定时,它将不是changes
对象中的键。
有关示例,请参阅此JSFiddle。 requiredBinding
和optionalBinding
都已省略,因此初始化为undefined
,但requiredBinding
是change
对象上的键,而optionalBinding
不是。
答案 1 :(得分:2)
使用<?
使得控制器可以更改应该绑定的变量的值,只有当该变量不存在时才会这样。
当控制器不存在时,可以在控制器中修改它们。如果值传递给组件,则无法更改它。
无法修改非可选绑定。如果它们不存在,则为undefined
,并且根本无法修改它们。
bindings: {
nameOptional: '<?',
nameRequired: '<'
}
在控制器中,不能只执行$ctrl.nameRequired = 'something else'
并期望视图得到更新。但是,可以对nameOptional
执行相同的条件:仅当name-optional
未传递给组件时。只有这时变量才是要改变的控制器。
为了更好地理解,您可以参考this fiddle。
请注意,为简化事物,我们使用的是一个按值传递的字符串。如果要传递对象,则可以在正常条件下修改对象的属性。