私はすでにあなたの問題を解決してきたが、それはむしろ、実際のソリューションよりも、回避策であることがわかります。ですから、なぜこれを体験し、解決するのかについていくつかの説明をしたいと思います。基本的に、質問はhereと同じ問題のかなり異なるケースです。
推測回答があったように私はコメント欄で詳細な説明を提供してきましたので、私はここで自分自身を繰り返すつもりです。コードの
重要なビットは、これらは以下のとおりです。
private state: State;
// ...
@computedFrom('state.activeSession')
私はすでにhereを説明したように、アウレリア変化検出が動作する方法は、アウレリアは、いくつかの値を観測するに関与なったとき、それがカスタムゲッターを設定していることですそれぞれのフィールドまたはプロパティの代わりにセッターを使用します。基本的には、どのようなセッターが行うことは、それが元のプロパティのセッターを呼び出します(または設定し、元のバッキングフィールド)、その後、任意の利害関係者に通知している(すなわち、そのプロパティにバインド何でも)値が変更されたこと。
これはあなたにとって意味をなさないのではないかと心配してください。重要なのは、何かにバインドするときに何かがあることがあるということです。の前にのバインディングが設定されています。
private state: State;
これはちょうどstate
が定義しているクラスの意味的に正しいことを活字体へのヒントです:あなたは、これが書いた場合などは、linked answerのコメントセクションで説明しました。言い換えれば、あなたは何に設定していないので、それは完全transpiled JavaScriptコードの外に残っている - それがないすべては、それが活字体でstate
の使用が有効になります。あなたはこのなかった場合
はたとえば、:何this.x
がないことを
function A() {
}
お知らせ:
class A {
x: number;
}
をその結果のJavaScriptが何かのようになります!しかし、もしあなたが代わりにこれを書いた:
class B {
x: number = undefined; // or null, or whatever you like
}
は、その結果のJavaScriptは次のようになります。
function B() {
this.x = undefined;
}
両者の違いは、最初のケースでは、に結合するプロパティがないということです。そのため、Aureliaはオブジェクトにプロパティが存在することを(JavaScriptで)いつ認識するかがわからないため、それを購読する方法がありません。あなたがそうのようなコンソールで値を検査した場合、ここでのことに注意することが重要である:
両方
a.x
と
b.x
var a = new A();
var b = new B();
console.log(a.x); // undefined
console.log(b.x); // undefined
はundefined
ように見えます。しかし、彼らは異なっている:それは明示的undefined
の値が割り当てられているためb.x
がundefined
ている間、それはは、a
に存在していないためa.x
はundefined
ある - それが存在しない、それだけでundefined
の値を持つように起こります。後者のシナリオは、 Aureliaがカスタムロジックをプロパティに設定できるようにしますが、前者のプロパティロジックは設定しません。要約すると
は、あなたの計算されたプロパティを動作させるために、あなたがする必要があるのは、その計算に関与しているすべてのプロパティにデフォルト値(例えば。undefined
、null
)を割り当てています。それはとにかく良い練習です。
おそらくこれは参考になる可能性があります。https://stackoverflow.com/questions/28419242/property-change-subscription-with-aurelia – csanonymus
私は既に店舗の状態を購読しています。私は自明にコールバックイベントを発生させ、ゲッターを手動で更新することができましたが、それはきれいではありませんでした。 – Fedoranimus
オブジェクトを 'this.state = response'に置き換えるのではなく、' state.activeSession'を設定するべきだと思います。 – janmvtrinidad