Подписка на изменение недвижимости с 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
смотреть коллекцию или контролировать, когда подписываться / отписываться