Aurelia @bindable *更改初始化调用

Aurelia @bindable *Changed calls on initialisation

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

https://gist.run/?id=d7d9e7c7080f581f8e81b888268a2f11

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

现在,我必须执行以下操作:

@bindable propOne;
@bindable propTwo;

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

bind() {
**  propOneChanged(propOne);**
}

有没有更好的方法来做到这一点(例如@bindable 装饰器中的某些东西),这样我就不需要在 bind() 中手动 'prime' 和 属性?

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() 方法,那么这是您调用更改处理程序的正确位置。

此外,我的印象是您并不完全确定可绑定项的工作原理。

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

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

所以为了解决您的评论:

it sometimes gets called before the custom component's bind() method and sometimes doesn't.

它将在自定义组件的 bind() 方法之前被调用 当且仅当 您在自定义组件的 bind() 之前为其分配了一些值。例如,在构造函数或 属性 初始值设定项中。

xyChanged 原型是 xyChanged(newValue, oldValue)。为了防止不必要的行为,我一直在做

if(oldvalue === null) return;

(在 bind() 之后直接为 null)。如果您使用异步模型请求,那么在大多数情况下,它在您的视图中进行空检查是有意义的

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