我发现当我为它定义一个@bindable属性和一个propertyChanged处理程序时,它有时会在自定义组件的bind()方法之前被调用,有时候不会。<\ n / p>
https://gist.run/?id=d7d9e7c7080f581f8e81b888268a2f11
在一些地方,我在一个属性上使用这些propertyChanged处理程序来触发对另一个属性的更新,在@computedFrom不适合的情况下,因为第二个值是一个复杂的计算,我不会#&# 39;多想多次打电话。
目前,我必须做以下事情:
@bindable propOne;
@bindable propTwo;
propOneChanged(newVal) {
propTwo = "something complex " + newVal;
}
bind() {
** propOneChanged(propOne);**
}
有没有更好的方法可以做到这一点(例如@bindable装饰器中的某些内容),这样我就不需要手动&#39; bind()中的属性?
答案 0 :(得分:3)
有没有更好的方法来执行此操作(例如@bindable装饰器中的某些内容),这样我就不需要在bind()中手动“填充”该属性了?
没有
如果您没有bind()
方法,则Aurelia会在bind()
期间致电您的更改处理程序。除非你有特定的事情需要做(除了启动你的绑定之外),删除bind()方法。那你就不用担心了。
如果你做有bind()
方法,那么这是你调用更改处理程序的正确位置。
另外,我得到的印象是你并不完全确定可绑定的工作方式。
简单地说:@bindable
装饰器告诉Aurelia框架将该属性包装在get
+ set
方法中(这种情况发生在组件加载时,在其生命周期之前)。
set
方法在收到与当前值不同的值时调用更改处理程序 - 当您为bindable
赋值时,无论组件是否为组件,都会调用更改处理程序是绑定的,即使它不是ViewModel。
所以要解决你的意见:
有时会在自定义组件的bind()方法之前调用它,有时则不会。
它将在自定义组件的bind()方法之前调用,当且仅当在自定义组件的bind()之前为其分配一些值时。例如,在构造函数或属性初始值设定项中。
答案 1 :(得分:0)
xyChanged原型是xyChanged(newValue, oldValue)
。为了防止不必要的行为,我一直在做
if(oldvalue === null) return;
(在bind()之后直接为null)。如果你使用异步模型请求它在大多数情况下有意义地在你的视图中进行空检查
<div if.bind="model.data">...</div>