Aurelia的财产和收藏观察员没有提出财产变更事件

时间:2016-10-17 21:51:39

标签: javascript aurelia aurelia-binding

我有一个代表DB中“玩家”的模型对象。在它的实现中有一系列的玩家,我想从我的应用程序中的不同VM绑定。例如:

import {Players} from './models/players';
import {inject, BindingEngine} from 'aurelia-framework';

@inject(Players,BindingEngine)
export class App {

  constructor(playersProvider,bindingEngine) {
    this._playersProvider = playersProvider;
    this._bindingEngine = bindingEngine;
    this._subscription = this._bindingEngine.propertyObserver(this,this._playersCount)
      .subscribe(this.objectValueChanged);
  }

  async activate() {
    await this._playersProvider.initialize();
    this._playersCount = this._playersProvider.players.length;
  }

  objectValueChanged(newVal,oldVal) {
    console.log("new : " + newVal + ", old val : " + oldVal);
  }

  deactivate() {
    this._subscription.dispose();
  }
}

不幸的是,当对播放器阵列(来自应用程序中的其他部分)进行更改时,更改不会反映在_playersCount属性中。例如 - 不会刷新绑定到此属性的UI标签,并且永远不会调用objectValueChanged。

U在同一阵列上具有collectionObserver的不同VM中存在相同的问题。

任何帮助?

1 个答案:

答案 0 :(得分:1)

您是否尝试在订阅之前在构造函数中声明_playersCount?

同样,synthax似乎不正确,应该根据this article

import {BindingEngine, inject} from 'aurelia-framework';

@inject(BindingEngine)
class MyClass {
  constructor(bindingEngine) {
    this.bindingEngine = bindingEngine;
    this.observeMe = 'myvalue'; // the property is first initialized in the constructor

    let subscription = this.bindingEngine
      .propertyObserver(this, 'observeMe') // <= you wrote this._bindingEngine.propertyObserver(this,this.observeMe)
      .subscribe(this.objectValueChanged);

    // Dispose of observer when you are done via: subscription.dispose();
  }

  objectValueChanged(newValue, oldValue) {
    console.log(`observeMe value changed from: ${oldValue} to:${newValue}`);
  }
}

async关键字可能会影响该行为。 如果它仍然不起作用,您可以使用事件聚合器来广播更改。