Подтвердить что ты не робот

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

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

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

Является ли это особенностью Aurelia? Если да, то как мне настроить такую ​​подписку?

4b9b3361

Ответ 1

В некоторых плагинах я использую 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();
  }
}

Ответ 2

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

Отрывок из кода с помощью 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

Ответ 3

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

import {observable} from "aurelia-framework";

export class Example {

    @observable
    public description: string;

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

    }
}

Ответ 4

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

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