更改集合时不会触发 Aurelia CollectionObserver 处理程序

Gae*_*aet 2 web-component typescript aurelia

我有一个 Aurelia 组件,它只是应该显示项目列表。组件的模型有一个可绑定的“items”属性:

@bindable items = [];
Run Code Online (Sandbox Code Playgroud)

组件模板使用简单的重复属性显示列表:

 <div repeat.for="item of items">  
    ${item.id}   </div>
Run Code Online (Sandbox Code Playgroud)

当我从使用该组件的页面视图模型中将新项目推送到绑定数组中时,我可以看到在刷新列表并出现新项目时添加了该项目。我的问题是,当修改“items”数组时,我需要执行其他操作,因此我尝试将 collectionObserver 添加到组件中,如下所示:

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

@inject(BindingEngine) 
export class GridControl {   

  @bindable items = [];

  constructor(bindingEngine) {
    this.items = []; 
    let subscription = bindingEngine.collectionObserver(this.items)
                                    .subscribe(this.listChanged);   
  }

  listChanged(splices) {
    // do some stuff   
  } 
}
Run Code Online (Sandbox Code Playgroud)

但是我的“listChanged”处理程序永远不会被调用。知道为什么吗?

Jer*_*yow 5

在构造函数中,bindingEngine.collectionObserver(this.items)被调用。

稍后,当组件进行数据绑定时,this.items会通过数据绑定分配一个不同的数组实例。这个不同的数组实例不是你传递给绑定引擎进行观察的那个。

尝试做这样的事情:

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

@inject(BindingEngine) 
export class GridControl {   
  @bindable items;

  constructor(bindingEngine) {
    this.bindingEngine = bindingEngine;
  }

  listChanged(splices) {
    // do some stuff   
  }

  subscribeItems() {
    if (this.items) {
      this.subscription = this.bindingEngine.collectionObserver(this.items)
        .subscribe(splices => this.listChanged(splices));
    }
  }

  unsubscribeItems() {
    if (this.subscription) {
      this.subscription.dispose();
      this.subscription = null;
    }
  }

  itemsChanged() {
    this.unsubscribeItems();
    this.subscribeItems();
  }

  unbind() {
    this.unsubscribeItems();
  }
}
Run Code Online (Sandbox Code Playgroud)