「コントローラ化」の詳細と初期化フロー
コントローラのバインド先について
コントローラのバインド先は、documentツリー上のノードである必要があります。
ノードとは、HTML要素以下のエレメント(bodyやdivなど)と、documentオブジェクトのことです。
ノードでないオブジェクトにはバインドできません。windowオブジェクトにもバインドできません。
初期化フロー
h5.core.controller()メソッドを使ってコントローラをコントローラ化した時の処理フローです。
コントローラ化についてはチュートリアル04.コントローラ > 「コントローラ化」をご覧ください。
- コントローラ名(__name)のチェックします。
- なければエラーとして処理します。
- 初期化パラメータがあった場合、オブジェクトかどうかのチェックします。
- オブジェクトでなければエラーとして処理します。
- 指定されたコントローラ定義オブジェクトが既にコントローラ化されているかどうかをチェックします。
- 既にコントローラ化されていればエラーとして処理します。
- ルートコントローラの場合、子コントローラ(プロパティ名の接尾辞がController)とロジック(プロパティ名の接尾辞がLogic)について循環参照のチェック
- 参照が循環している場合、エラーとして処理します。
- ルートコントローラの場合、バインド対象となるDOM要素のチェックをしてrootElementを設定
- 要素が存在しない、もしくは複数存在する場合はエラーとして処理します。
- コントローラのインスタンスを作成します。
- __controllerContext, preInitPromise, initPromise, postInitPromise, readyPromiseを、コントローラのインスタンスに設定します。
- __templatesで指定されているテンプレートのパスから、テンプレートを読み込みます。
- イベントハンドラ、関数(ライフサイクルイベントハンドラ含む)であるプロパティについて、AOPを適用します。
- プロパティがイベントハンドラの場合AOPを適用し、バインド情報を管理するマップに参照を追加します。
同一のセレクタとイベント名を持つイベントハンドラが2つ以上存在する場合、エラーとして処理します。 - プロパティがライフサイクルイベント、イベントハンドラのどちらでもない関数の場合、AOPを適用します。
- __constructを実行します。プロパティが存在しない場合実行しません。
- rootController, parentControllerを、コントローラのインスタンスに設定します。
- 子コントローラが子コントローラを持っている場合は再帰的にコントローラ化を行います。
- 子コントローラ定義がDependencyオブジェクトで指定されている場合、依存関係の解決を行ってコントローラ化を行います
- ロジック化を実行します。ロジックが子ロジックを持っている場合は再帰的にロジック化を行います。
- ロジック定義がDependencyオブジェクトで指定されている場合、依存関係の解決を行ってロジック化を行います
- __initを実行します。__initは親から順に実行されます。プロパティが存在しない場合実行しません。
- __init後の処理
- 子コントローラのrootElementをを設定します。__meta定義がある場合は、__metaでの定義に従ってrootElementを決定します
- __meta定義がある場合で、ルートエレメントの指定が不正(存在しないまたは複数要素の指定)である場合はエラー
- 子コントローラについて再帰的に__init及び__init後の処理を実行します
- 子コントローラのrootElementをを設定します。__meta定義がある場合は、__metaでの定義に従ってrootElementを決定します
- __postInitを実行します。__postInitは子から順に実行されます。プロパティが存在しない場合実行しません。
- イベントハンドラをバインドします
- ただしuseHandlersにfalseが指定されている場合、子コントローラ及び子コントローラが保持するコントローラ(子孫コントローラ)のイベントハンドラはバインドしません。
- h5controllerboundイベントをトリガします。
- コントローラのインスタンスを、グローバルコントローラの管理対象に追加します。
- __readyを実行します。__readyは子から順に実行されます。プロパティが存在しない場合実行しません。
- h5controllerreadyイベントをトリガします。