Javascript Aurelia绑定钩在“上”;嵌套的;自定义元素中的数据更新

Javascript Aurelia绑定钩在“上”;嵌套的;自定义元素中的数据更新,javascript,binding,aurelia,Javascript,Binding,Aurelia,当绑定对象中发生更新时,我希望得到通知。 这个砰的一声说明了我的问题 更详细地说: 我通过bind[data.bind]将对象“data”传递到自定义元素中。如果我现在 更新数据中的属性,我希望 调用自定义元素。 如果我在自定义元素模板中显示绑定数据对象的属性,它将得到更新,因此绑定本身可以正常工作 我的第二个缺点是使用了ObserverLocator,但它也不会在嵌套更新时启动 app.js中的对象: this.data = { nested: { content: "Hello

当绑定对象中发生更新时,我希望得到通知。 这个砰的一声说明了我的问题

更详细地说: 我通过bind[data.bind]将对象“data”传递到自定义元素中。如果我现在 更新数据中的属性,我希望 调用自定义元素。 如果我在自定义元素模板中显示绑定数据对象的属性,它将得到更新,因此绑定本身可以正常工作

我的第二个缺点是使用了ObserverLocator,但它也不会在嵌套更新时启动

app.js中的对象:

this.data = {
  nested: {
    content: "Hello nested world!"
  }
};
与自定义元素ce的绑定:

<require from="ce"></require>
<ce data.bind="data"></ce>
ce模板部分:

${data.nested.content}
在app.js中,我每隔两次更新数据对象。 第一个间隔每秒编辑一个“嵌套”属性。 每隔五秒的第二个间隔将设置新的数据对象。 在第二个间隔,钩子和观察者被调用, 但我想知道,第一次间隔什么时候有变化

setInterval(() => {
  this.data.nested.content += "!";
}, 1000);


setInterval(() => {
  this.data = {
  nested: {
    content: "Hello nested world No. " + this.counter++  + "!"
  }
};
}, 5000);

ObserverLocator
是Aurelia的裸机API,用于观察简单的属性变化和数组/映射/集突变

有一个新的、更高级别的API,名为
BindingEngine
,可以用来观察复杂的表达式

这里有一个例子:

ce.html


${data.nested.content}
观察到的变化:
ce.js

导入{
可装订的,
绑定引擎,
注射
}来自“奥雷利亚框架”;
@注入(绑定引擎)
出口级Ce{
@可绑定数据;
changes=[];//调试日志记录
构造函数(绑定引擎){
this.bindingEngine=bindingEngine;
}
表达式已更改(新值、旧值){
//调试日志记录:
splice(0,0,`expressionChanged:${newValue}`);
}
同步订阅(订阅){
如果(此订阅){
this.subscription.dispose();
this.subscription=null;
}
if(订阅此.data(&S){
让observer=this.bindingEngine.expressionObserver(this.data,'nested.content');
this.subscription=observer.subscripte(::this.expressionChanged);
}
}
数据更改(新值、旧值){
//订阅新数据实例
此.syncSubscription(true);
//调试日志记录:
this.changes.splice(0,0,`dataChanged:${JSON.stringify(newValue,null,2)}`);
}
附({
//订阅
此.syncSubscription(true);
}
分离的(){
//取消订阅(避免内存泄漏)
此.syncSubscription(false);
}
}
为什么aurelia在默认情况下不观察整个对象的变化


就速度和记忆而言,它太昂贵了,无法急切地观察每一件事。并非所有浏览器都支持对象。请注意。

谢谢!工作原理与charm=)是否有方法获取对整个对象的引用,而不仅仅是新旧值?
setInterval(() => {
  this.data.nested.content += "!";
}, 1000);


setInterval(() => {
  this.data = {
  nested: {
    content: "Hello nested world No. " + this.counter++  + "!"
  }
};
}, 5000);