【问题标题】:Array subscription in AureliaAurelia 中的数组订阅
【发布时间】:2016-10-13 07:01:29
【问题描述】:

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

@inject(ObserverLocator)
export class ViewModel {

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

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

【问题讨论】:

  • 观察 list.length 是否足够?看到正在发生的变化不是更容易吗?

标签: javascript aurelia


【解决方案1】:

getObserver 返回一个属性观察器,当ViewModel 类实例的list 属性发生变化时,它将通知您。这只会在您为list 属性分配新值时发生,即this.list = [1,2,3]。如果您没有为list 属性分配新值,而是通过pushpopsplice 等改变属性的值,您将需要使用数组观察器。使用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 的内部“裸机”API。现在有一个可用于绑定引擎的公共 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();
  }
}

【讨论】:

  • 这里的语法有没有改变?
  • 我们从未添加过像 import { observe } from 'aurelia-framework' 这样简单的东西;观察(任何事情,回调)?
  • 这是否仍然有效(10 月更新),因为我似乎无法让 collectionObserver 回调工作,但您之前的示例工作正常?
  • 应该可以 - 如果您想提出一个新问题,其中包含有关您的问题的一些细节,我可以调查一下。
  • 抱歉,发现了我的问题。我在构造函数中调用 dispose (与您发布的代码相同)。呃!对不起
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
相关资源
最近更新 更多