Подписка на Array в Aurelia - программирование
Подтвердить что ты не робот

Подписка на Array в Aurelia

Скажем, у меня есть массив элементов и в дополнение к отображению списка в моем приложении, я хочу синхронизировать список с сервером с помощью HttpClient. Как я могу наблюдать изменения в массиве? Я пробовал:

@inject(ObserverLocator)
export class ViewModel {

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

Но я не получил ни сообщения об ошибке, ни сообщения журнала.

4b9b3361

Ответ 1

getObserver возвращает наблюдателя свойств, который будет уведомлять вас, когда свойство ViewModel класса экземпляра list изменяется. Это произойдет, когда вы присвоите новое значение свойству list, т.е. this.list = [1,2,3]. Если вы не присваиваете новые значения свойству list и вместо этого изменяете значение свойства с помощью push, pop, splice и т.д., Вы захотите использовать наблюдателя массива. Используйте метод ObserverLocator getArrayObserver - он принимает один параметр, массив, который вы хотите наблюдать:

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 г.

ObserverLocator - это внутренний API "голый металл" Aurelia. Теперь существует общедоступный 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();
  }
}