Aurelia@bindable*更改了初始化调用

Aurelia@bindable*更改了初始化调用,aurelia,Aurelia,我发现,当我定义@bindable属性和它的propertyChanged处理程序时,它有时会在自定义组件的bind()方法之前被调用,有时不会 在一些地方,我在一个属性上使用这些propertyChanged处理程序来触发对另一个属性的更新,在@computedFrom不合适的情况下,因为第二个值是一个复杂的计算,我不想多次调用 目前,我必须做以下工作: @bindable propOne; @bindable propTwo; propOneChanged(newVal) { pro

我发现,当我定义@bindable属性和它的propertyChanged处理程序时,它有时会在自定义组件的bind()方法之前被调用,有时不会

在一些地方,我在一个属性上使用这些propertyChanged处理程序来触发对另一个属性的更新,在@computedFrom不合适的情况下,因为第二个值是一个复杂的计算,我不想多次调用

目前,我必须做以下工作:

@bindable propOne;
@bindable propTwo;

propOneChanged(newVal) {
  propTwo = "something complex " + newVal;
}

bind() {
**  propOneChanged(propOne);**
}
有没有更好的方法(例如@bindable decorator中的某些内容)来实现这一点,这样我就不需要在bind()中手动“初始化”属性了

有没有更好的方法(例如@bindable decorator中的某些内容)来实现这一点,这样我就不需要在bind()中手动“初始化”属性了

没有

如果您没有
bind()
方法,那么Aurelia将在
bind()
期间调用您的更改处理程序。除非您有特定的事情需要做(除了启动绑定表之外),删除bind()方法。那你就不用担心了

如果您确实有一个
bind()
方法,那么这就是调用更改处理程序的正确位置

另外,我得到的印象是,你并不完全确定活页夹是如何工作的

简单地说:
@bindable
装饰器告诉Aurelia框架将该属性包装在
get
+
set
方法中(这发生在加载组件时,远远早于其生命周期)

set
方法在收到与当前值不同的值时调用更改处理程序-当您将值分配给
bindable
时,将调用更改处理程序,无论组件是否绑定,即使它不是ViewModel

因此,为了回应您的评论:

它有时在自定义组件的bind()方法之前被调用,有时不被调用


当且仅当您在自定义组件的bind()之前为其赋值时,才会在自定义组件的bind()方法之前调用它。例如,在构造函数或属性初始值设定项中

xyChanged原型是
xyChanged(newValue,oldValue)
。为了防止不必要的行为,我总是这样做

if(oldvalue === null) return;
(直接在bind()之后为null)。如果您使用异步模型请求,在大多数情况下,它意味着在视图中执行空检查

<div if.bind="model.data">...</div>
。。。

纠正异步请求,但如果应用程序庞大而复杂,那么在您的视图中这样做会使应用程序变得非常脆弱。在
activate()
期间加载数据更容易,或者如果必须在
bind()
期间加载数据,只需使用compositionTransaction即可。顺便说一句,
oldValue
在第一次更改时总是
undefined
(而不是
null
),因此在这种情况下,check不起任何作用。