Tengo una propiedad en mi modelo de vista que quiero escuchar y desencadenar eventos en función de su valor, así:
class viewModel { constructor() { this.value = '0'; let val = 2; subscribe(this.value, callbackForValue); subscribe(val, callbackForVal); } }¿Es esta una característica de Aurelia? Si es así, ¿cómo haría para configurar dicha suscripción?
En algunos complementos, he estado usando DI para obtener la instancia de ObserverLocator del contenedor:
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; } ... }A continuación, puede hacer algo como esto:
var subscription = this.observerLocator .getObserver(myObj, 'myPropertyName') .subscribe(myCallback);Cuando esté listo para deshacerse de la suscripción, invóquela:
subscription();Creo que todo esto está sujeto a cambios, pero es algo que podrías usar ahora mismo si lo necesitas.
Más información aquí
ObserverLocator es la API "bare metal" interna de Aurelia. Ahora hay una API pública para el motor de enlace que podría usarse:
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(); } }El atributo observable tiene menos sobrecarga que enlazar según I kill nerds .
import {observable} from "aurelia-framework"; export class Example { @observable public description: string; private descriptionChanged(newValue: string, oldValue: string): void { } }escuchar y desencadenar eventos en función de su valor
Un fragmento de código usando TypeScript, con suerte eso le dará una idea:
import {bindingMode} from "aurelia-binding"; export class Example{ @bindable public description: string; private descriptionChanged(newValue: string, oldValue: string): void { console.log(newValue, oldValue); } } El nombre del método debe seguir la convención `${propertyName}Changed`
EDITAR: Eso es exactamente lo que Decade Moon sugirió en el comentario anterior: Suscripción de cambio de propiedad con Aurelia