2017-08-12 10 views
4

sessionというオブジェクトを持つstateオブジェクトがあります。このプロパティは、objectまたはnullのいずれかです。Aureliaの計算対象からオブジェクト

isSessionActive()ゲッターの汚れチェックをしたくないので、computedFrom()を使用したいと思います。ただし、undefined以前の場合を除いて、このオブジェクトが変更されたときにcomputerFrom()は発生しません。

私はこれは私の状態ストアの専用isSessionActiveブール型プロパティなしで行うことができますか?

@autoinject 
export class Home { 
    firstName: string = "user"; 
    private state: State; 

    constructor(private store: Store) { 
     store.state.subscribe(
      response => this.state = response 
     ) 
    } 

    @computedFrom('state.activeSession') 
    get isSessionActive() { 
     return this.state.activeSession !== null; 
    } 
} 
+0

おそらくこれは参考になる可能性があります。https://stackoverflow.com/questions/28419242/property-change-subscription-with-aurelia – csanonymus

+0

私は既に店舗の状態を購読しています。私は自明にコールバックイベントを発生させ、ゲッターを手動で更新することができましたが、それはきれいではありませんでした。 – Fedoranimus

+0

オブジェクトを 'this.state = response'に置き換えるのではなく、' state.activeSession'を設定するべきだと思います。 – janmvtrinidad

答えて

2

私は次のことをやってしまった:

isSessionActive: boolean = false; 

constructor(private store: Store) { 
    store.state.subscribe(
     response => { 
      this.state = response; 
      this.isSessionActive = response.activeSession !== null; 
     } 
    ) 
} 
+0

上記の私の答えを参照してください、私はおそらく、これはあなたがこの答えで持っている方法を達成するだろう、それはコードが少ないので、getter上で '@computedFrom( 'state')'で行うことができる。 –

+0

ありがとうございます。これはコードは少なくなりますが、私にはそれほどクリーンではありません。それはただの感性です。 – Fedoranimus

1

私はすでにあなたの問題を解決してきたが、それはむしろ、実際のソリューションよりも、回避策であることがわかります。ですから、なぜこれを体験し、解決するのかについていくつかの説明をしたいと思います。基本的に、質問は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.xb.x
var a = new A(); 
var b = new B(); 
console.log(a.x); // undefined 
console.log(b.x); // undefined 

undefinedように見えます。しかし、彼らは異なっている:それは明示的undefinedの値が割り当てられているためb.xundefinedている間、それはは、a存在していないためa.xundefinedある - それ存在しない、それだけでundefinedの値を持つように起こります。後者のシナリオは、 Aureliaがカスタムロジックをプロパティに設定できるようにしますが、前者のプロパティロジックは設定しません。要約すると

は、あなたの計算されたプロパティを動作させるために、あなたがする必要があるのは、その計算に関与しているすべてのプロパティにデフォルト値(例えば。undefinednull)を割り当てています。それはとにかく良い練習です。

+0

ありがとう、それは多くの文脈を提供します。 – Fedoranimus

関連する問題