Подписка на изменение недвижимости с Aurelia

У меня есть свойство в моей viewmodel, которое я хочу слушать и запускать события на основе его значения, например:

class viewModel {
  constructor() {
    this.value = '0';
    let val = 2;
    subscribe(this.value, callbackForValue);
    subscribe(val, callbackForVal);
  }
}

Это особенность Аурелии? Если да, то как мне настроить такую ​​подписку?

4 ответа

Решение

В некоторых плагинах я использовал DI, чтобы получить ObserverLocator экземпляр из контейнера:

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

@inject(ObserverLocator)
export class Foo {
    constructor(observerLocator) {
        this.observerLocator = observerLocator;
    }
    ...
}

Затем вы можете сделать что-то вроде этого:

var subscription = this.observerLocator
    .getObserver(myObj, 'myPropertyName')
    .subscribe(myCallback);

Когда вы будете готовы отказаться от подписки, запустите ее:

subscription();

Я думаю, что все это может измениться, но это то, что вы могли бы использовать прямо сейчас, если вам нужно.

Больше информации здесь

Обновление за октябрь 2015

ObserverLocator - это API-интерфейс Aurelia для "голого металла". Теперь есть общедоступный API для механизма привязки, который можно использовать:

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

@inject(BindingEngine)
export class ViewModel {
  constructor(bindingEngine) {
    this.obj = { foo: 'bar' };

    // subscribe
    let subscription = bindingEngine.propertyObserver(this.obj, 'foo')
      .subscribe((newValue, oldValue) => console.log(newValue));

    // unsubscribe
    subscription.dispose();
  }
}

У наблюдаемого атрибута меньше накладных расходов на привязку, согласно " Я убиваю ботаников".

import {observable} from "aurelia-framework";

export class Example {

    @observable
    public description: string;

    private descriptionChanged(newValue: string, oldValue: string): void {

    }
}

слушать и запускать события на основе его значения

Фрагмент из кода с использованием TypeScript, надеюсь, он поможет вам понять:

import {bindingMode} from "aurelia-binding";

export class Example{

    @bindable
    public description: string;

    private descriptionChanged(newValue: string, oldValue: string): void {
        console.log(newValue, oldValue);
    }
}

Имя метода должно соответствовать соглашению `${propertyName}Changed`


РЕДАКТИРОВАТЬ: Это именно то, что Decade Moon предложил в комментарии выше: подписка на изменение собственности с Aurelia

@observable Декоратор отлично работает для этого сценария.

Вы могли бы использовать BindingEngine смотреть коллекцию или контролировать, когда подписываться / отписываться

Другие вопросы по тегам