次のように、値に基づいてイベントをリッスンし、トリガーするビューモデルにプロパティがあります。
class viewModel {
constructor() {
this.value = '0';
let val = 2;
subscribe(this.value, callbackForValue);
subscribe(val, callbackForVal);
}
}
これはAureliaの機能ですか?もしそうなら、そのようなサブスクリプションを設定するにはどうすればよいですか?
一部のプラグインでは、コンテナからObserverLocator
インスタンスを取得するためにDIを使用しています。
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();
これはすべて変更される可能性があると思いますが、必要に応じてすぐに使用できるものです。
詳細ここ
ObserverLocatorは、Aureliaの内部「ベアメタル」APIです。現在、使用可能なバインディングエンジン用のパブリック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();
}
}
Observable属性には、 I kill nerds によるバインディングへのオーバーヘッドが少ない。
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`
EDIT:それはまさに Decade Moon 上記のコメントで提案されたものです: Aureliaでのプロパティ変更サブスクリプション
@observable
デコレータは、このシナリオでは正常に機能します。
BindingEngine
を使用して、コレクションを監視したり、購読/購読解除のタイミングを制御したりできます。