我发现当我为它定义一个@bindable 属性和一个 propertyChanged 处理程序时,它有时会在自定义组件的 bind() 方法之前被调用,有时则不会。
https://gist.run/?id=d7d9e7c7080f581f8e81b888268a2f11
在几个地方,我在一个属性上使用这些 propertyChanged 处理程序来触发对另一个属性的更新,在 @computedFrom 不合适的情况下,因为第二个值是一个复杂的计算,我不想称为 multiple次。
现在,我必须执行以下操作:
@bindable propOne;
@bindable propTwo;
propOneChanged(newVal) {
propTwo = "something complex " + newVal;
}
bind() {
** propOneChanged(propOne);**
}
有没有更好的方法来做到这一点(例如@bindable 装饰器中的某些东西),这样我就不需要手动“填充”bind() 中的属性?
最佳答案
Is there any better way to do this (e.g. something in the @bindable decorator) so that I don't need to manually 'prime' the property in the bind()?
没有。
如果您没有bind()
方法,那么Aurelia 将在bind()
期间调用您的更改处理程序。除非您有特定的事情需要做(除了启动您的可绑定(bind)对象之外),否则请删除 bind() 方法。那你就不用担心了。
如果您确实有一个bind()
方法,那么这是您调用更改处理程序的正确位置。
此外,我的印象是您并不完全确定可绑定(bind)对象的工作原理。
简单地说:@bindable
装饰器告诉 Aurelia 框架将该属性包装在 get
+ set
方法中(这发生在组件在其生命周期之前加载)。
set
方法在接收到与当前值不同的值时调用更改处理程序 - 当您将值分配给 bindable
时,将调用更改处理程序,无论组件是否绑定(bind),即使它不是 ViewModel。
所以为了解决您的评论:
it sometimes gets called before the custom component's bind() method and sometimes doesn't.
它将在自定义组件的 bind() 方法之前被调用,当且仅当您在自定义组件的 bind() 之前为其分配了一些值。例如,在构造函数或属性初始值设定项中。
关于Aurelia @bindable *更改初始化调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925697/