Aurelia 中的数组订阅

Array subscription in Aurelia

假设我有一个元素数组,除了在我的应用程序中显示列表外,我还想使用 HttpClient 将列表同步到服务器。如何观察数组的变化?我试过了:

@inject(ObserverLocator)
export class ViewModel {

    constructor(obsLoc) {
        this.list = [];
        obsLoc.getObserver(this, 'list');
            .subscribe(li => console.log(li));
    }
}

但是我既没有收到错误消息也没有收到日志消息。

getObserver returns 一个 属性 观察者,它将在 ViewModel class 实例的 list 属性 发生变化时通知您.这只会在您为 list 属性 分配新值时发生,即 this.list = [1,2,3]。如果您没有为 list 属性 分配新值,而是通过 pushpop、[=20= 改变 属性 的值],等等,你会想要使用数组观察器。使用 ObserverLocatorgetArrayObserver 方法 - 它需要一个参数,即您要观察的数组:

import {ObserverLocator} from 'aurelia-binding'; // or from 'aurelia-framework'

@inject(ObserverLocator)
export class ViewModel {

    constructor(obsLoc) {
        this.list = [];
        obsLoc.getArrayObserver(this.list);
            .subscribe(splices => console.log(splices));
    }
}

2015 年 10 月更新

ObserverLocator 是 Aurelia 的内部 "bare metal" API。现在有一个 public API 可以使用的绑定引擎:

import {BindingEngine} from 'aurelia-binding'; // or from 'aurelia-framework'

@inject(BindingEngine)
export class ViewModel {
  constructor(bindingEngine) {
    this.list = []; // any Array, Map and soon Set will be supported

    // subscribe
    let subscription = bindingEngine.collectionObserver(this.list)
      .subscribe(splices => console.log(splices));

    // be sure to unsubscribe **later**
    subscription.dispose();
  }
}