Aureliaでビューモデルとして機能しているes6クラスをエクスポートすると、コンストラクターとアクティベート関数の両方で初期化コードを設定できるようです。
ここに標準的な規則はありますか?
一方では特定の初期化を行うべきですか、他方では行わないのですか?
Es6クラスを実装していないユーザーのためのアクティブ化機能はありますか?
インスタンスプロパティは、コンストラクタとactivateメソッドの両方で設定できます。どちらもAureliaによって呼び出されます。ただし、ここには一種の概念的な違いがあります。
アクティブ化は画面アクティブ化ライフサイクルメソッドの1つであり、画面/ビューモデルの動作のみを制御するために使用するのが理想的です。たとえば、canDeactivate
メソッドは、ビューモデルに移動できるかどうかなどを制御します。アクティブ化は、ビューモデルがレンダリングされる直前(ただしattached
フックの前)に実行されるフックでもあります。ただし、activate
メソッドが呼び出されず、コンストラクター内でルートがナビゲートされる、またはcanActivate
メソッドが拒否またはfalseを返す可能性があります。この場合、コンストラクトは引き続き呼び出されますが、アクティブ化はない。
一方、construct
メソッドは他のフックやメソッドの前に呼び出されるため、activate
の前に呼び出されます。このため、コンストラクトは依存関係の注入を行うため、構成プロパティを設定するための主要な場所です。したがって、activateは固定のパラメーターセット(params、routeConfig、navigationInstruction)を取りますが、constructor
メソッドに渡されるパラメーターリストは、ビューモデルクラスに注入するサービスによって異なります。
ここで私が目にする大きな違いの1つは、activateメソッドがPromisを戻り値として持つため、ここで非同期コードを実行できることです。コンストラクターで非同期コードをトリガーすることは非常に悪い考えです。詳細は、コンストラクターが例外をスローしてはならないため、通常、ここではanyロジックなしでコンストラクターパラメーターをローカル変数に割り当てるだけです。私はコンストラクタでこれ以上のことはしませんし、実際のロジックによるビューモデルの初期化はactivateまたはattachedメソッドで発生するはずです。