web-dev-qa-db-ja.com

Aureliaクラスコンストラクターvsアクティベート

Aureliaでビューモデルとして機能しているes6クラスをエクスポートすると、コンストラクターとアクティベート関数の両方で初期化コードを設定できるようです。

ここに標準的な規則はありますか?

一方では特定の初期化を行うべきですか、他方では行わないのですか?

Es6クラスを実装していないユーザーのためのアクティブ化機能はありますか?

18

インスタンスプロパティは、コンストラクタとactivateメソッドの両方で設定できます。どちらもAureliaによって呼び出されます。ただし、ここには一種の概念的な違いがあります。

アクティブ化は画面アクティブ化ライフサイクルメソッドの1つであり、画面/ビューモデルの動作のみを制御するために使用するのが理想的です。たとえば、canDeactivateメソッドは、ビューモデルに移動できるかどうかなどを制御します。アクティブ化は、ビューモデルがレンダリングされる直前(ただしattachedフックの前)に実行されるフックでもあります。ただし、activateメソッドが呼び出されず、コンストラクター内でルートがナビゲートされる、またはcanActivateメソッドが拒否またはfalseを返す可能性があります。この場合、コンストラクトは引き続き呼び出されますが、アクティブ化はない。

一方、constructメソッドは他のフックやメソッドの前に呼び出されるため、activateの前に呼び出されます。このため、コンストラクトは依存関係の注入を行うため、構成プロパティを設定するための主要な場所です。したがって、activateは固定のパラメーターセット(params、routeConfig、navigationInstruction)を取りますが、constructorメソッドに渡されるパラメーターリストは、ビューモデルクラスに注入するサービスによって異なります。

19
dfsq

ここで私が目にする大きな違いの1つは、activateメソッドがPromisを戻り値として持つため、ここで非同期コードを実行できることです。コンストラクターで非同期コードをトリガーすることは非常に悪い考えです。詳細は、コンストラクターが例外をスローしてはならないため、通常、ここではanyロジックなしでコンストラクターパラメーターをローカル変数に割り当てるだけです。私はコンストラクタでこれ以上のことはしませんし、実際のロジックによるビューモデルの初期化はactivateまたはattachedメソッドで発生するはずです。

8
Lukas K