Javascript 更改为包含数组时更新Aurelia observed属性

Javascript 更改为包含数组时更新Aurelia observed属性,javascript,aurelia,Javascript,Aurelia,我有一个简单的类,Event,具有计算属性: 从“时刻”导入时刻; 导出类事件{ 建造师(数据){ 分配(此,数据); } 从现在开始播放(){ 返回时刻(this.CreateDate).fromNow(); } } playedFromNow只返回一个基于CreateDate属性的字符串,就像7分钟前的 viewmodel获取事件数组,视图呈现事件。每当新事件发生时(每隔几分钟),该数组都会通过WebSocket进行更新 ${event.title}${event.playedFromN

我有一个简单的类,
Event
,具有计算属性:

从“时刻”导入时刻;
导出类事件{
建造师(数据){
分配(此,数据);
}
从现在开始播放(){
返回时刻(this.CreateDate).fromNow();
}
}
playedFromNow
只返回一个基于
CreateDate
属性的字符串,就像7分钟前的

viewmodel获取事件数组,视图呈现事件。每当新事件发生时(每隔几分钟),该数组都会通过WebSocket进行更新


${event.title}${event.playedFromNow}
以及(相关)viewmodel代码:

let socket=io();
socket.on(`newevent`,(data)=>{
this.events.unshift(新事件(数据));//添加到顶部的事件数组
});
//订阅
让subscription=bindingEngine.collectionObserver(this.events.subscripte();
//退订
subscription.dispose();

目前该属性是脏检查的,这意味着该属性被检查和更改非常频繁-这有点不必要,而且屏幕上显示了很多事件,因此我担心随着时间的推移性能。是否有一种方法可以根据VM中的数组绑定和更新代码触发重新计算?:

最新的aurelia版本有一个新功能:这将有助于解决此用例

第一步是从视图模型中删除
playedFromNow
属性。我们将把逻辑放在一个值转换器中,以消除脏检查,并使逻辑能够在其他视图中重用:

从现在开始.js

从“时刻”导入时刻;
从NowValueConverter导出类{
toView(日期){
返回时刻(日期).fromNow();
}
}
现在,让我们更新视图以使用值转换器以及内置的
信号
绑定行为。使用
信号
我们可以告诉绑定何时刷新

${event.playedFromNow}
更改为:

${event.CreateDate | fromNow&信号:'tick'}
在简单的英语中,此绑定表示,使用
fromNow
转换器转换日期值,并在发出
勾选
信号时刷新绑定

不要忘记导入视图顶部的值转换器:


最后,让我们定期触发
勾选
信号。。。每分钟

从“aurelia模板资源”导入{BindingSignaler};
@注入(绑定信号器)
导出类应用程序{
建造师(信号员){
//每分钟刷新信号名为“tick”的所有绑定:
设置间隔(()=>信号机信号('tick'),60*1000);
}
}

遵循您的答案,在my web sockets事件中放置一个
信号器。信号('new-event')
也非常有效。非常感谢。