Aurelia push()时computedFrom数组不会更新,但在重新分配时会起作用

Aurelia push()时computedFrom数组不会更新,但在重新分配时会起作用,aurelia,Aurelia,我想这背后是有原因的,但如果我的虚拟机中有一个数组并推送到它,我的@computedFrom方法将不会更新。如果我改为使用concat,并且基本上完成了与推送相同的任务,则推送会更新: 为了代码的清晰性和可能的性能,我更喜欢使用push,有什么办法吗?目前,computedFrom使用属性观察器,而不是数组观察器 为了解决您的问题,我会退一步,根本不使用computedFrom和getter。如果要强制订阅阵列,请使用绑定信号器 home.html 下面是一个工作示例: 此外,我还编写了一个名为

我想这背后是有原因的,但如果我的虚拟机中有一个数组并推送到它,我的@computedFrom方法将不会更新。如果我改为使用concat,并且基本上完成了与推送相同的任务,则推送会更新:

为了代码的清晰性和可能的性能,我更喜欢使用push,有什么办法吗?

目前,computedFrom使用属性观察器,而不是数组观察器

为了解决您的问题,我会退一步,根本不使用computedFrom和getter。如果要强制订阅阵列,请使用绑定信号器

home.html

下面是一个工作示例:


此外,我还编写了一个名为Bouncer的通用过滤值转换器。您可以在此处查看或获取源代码。

我可能做错了什么,但如果我在setTimeout中将新元素推送到列表数组,它似乎不会更新:/You's very right。我已经编辑了我的答案,它正在为你上面的要点工作。谢谢。你认为使用信号机比简单地指挥要好吗?在我看来,concat代码更容易阅读,我不必先添加我的项目,然后告诉某些UI进行更新,我只需添加我的项目,整个UI就会得到更新——不管他们是否使用“store:add”信号器。这是我喜欢使用Aurelia这样的框架的主要原因,我不必手动更新UI。在我看来,这样做是不符合目的的。难道没有办法告诉奥雷莉亚,我的可观测的或不管它叫什么,是一个数组,这样推就可以工作了吗?我不太清楚,但我相信使用concat会对性能产生影响。我相信concat会生成一个新的数组,根据您的代码,如果您广泛使用concat,您的应用程序周围可能会有同一数组的多个副本。同样,优化的第一条规则是:不要。第二条规则:还没有。因此,您可能还是希望使用concat路由。它只适用于更新repeat.for绑定,这需要一个iterable。
import { computedFrom } from 'aurelia-framework';

export class MyVm {
    constructor () {
        this.list = [{name: 'Foo', id: 0, open: true}, {name: 'Bar', id: 1, open: false}];

        setTimeout(() => {
            this.list.push({name: 'Baz', id: 2, open: true}); // This won't update numOpenListItems
            this.list = this.list.concat([{name: 'Baz', id: 2, open: true}]); // This will
        });
    }

    @computedFrom('list')
    get numOpenListItems () {
        return this.list.filter(item => item.open === true).length;
    }
}
<div with.bind="list | open & signal: 'store:add'">
  ${length}
</div>
import { inject } from 'aurelia-framework';
import { BindingSignaler } from 'aurelia-templating-resources';

@inject(BindingSignaler)
export class HomeViewModel

    constructor(signaler) {
        this.signaler = signaler
    }

    add(store) {
        this.list.push(store)
        this.signaler.signal('store:add')
    }
}