この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

表示ライフサイクル中に起動されたイベント

コンポーネントはそのライフサイクルの間にインスタンス化され、表示され、さらに再表示されます。コンポーネントが再表示されるのは、プログラムまたは値が変更されて再表示が必要になった場合のみです。たとえば、ブラウザイベントがアクションをトリガしてデータが更新された場合などです。

コンポーネントのライフサイクルは、クライアントが HTTP 要求をサーバに送信し、コンポーネント設定データがクライアントに返されると開始します。以前の要求によってコンポーネント定義がすでにクライアント側にあり、コンポーネントにサーバとの連動関係がない場合は、このサーバとの往復のやりとりは行われません。

クライアントの表示ライフサイクルに進む前に、コンポーネント要求のサーバ側およびクライアント側処理について簡単に理解しておくと役立ちます。フレームワークは、インターフェース、コントローラ、アクションの定義を含む、コンポーネント定義とそのすべての連動関係をサーバに作成します。コンポーネントインスタンスが作成されると、逐次化されたコンポーネント定義とインスタンスがクライアントに送信されます。定義はキャッシュされますが、インスタンスデータはキャッシュされません。

クライアントは、応答の逐次化を解除して JavaScript オブジェクトまたは対応付けを作成します。その結果、コンポーネントインスタンスの表示に使用するインスタンスツリーが作成されます。クライアントはコンポーネントのバンドル内のカスタムレンダラを検索するか、デフォルトのレンダラメソッドを使用します。

次の図は、コンポーネント定義とインスタンスの逐次化が解除された後のクライアントでのコンポーネントの典型的な表示ライフサイクルを表しています。

表示ライフサイクルは、init イベントの後に開始し、doneRendering イベントで終了します。

  1. init イベントは、コンポーネントを構成するコンポーネントサービスによって起動され、初期化が完了したこと通知します。
    1swfobject.registerObject("clippy.codeblock-0", "9");<aura:handler name="init" value="{!this}" action="{!.c.doInit}"/>
    init ハンドラをカスタマイズして、独自のコントローラロジックを追加できます。詳細は、「コンポーネントの初期化時のアクションの呼び出し」を参照してください。
  2. render() がコールされて、コンポーネントの表示が開始されます。aura:component のレンダラには render() という基本実装がありますが、ユーザのコンポーネントはカスタムレンダラでこのメソッドを上書きできます。詳細は、「DOM へのクライアント側表示」を参照してください。
  3. afterRender() は、これらのコンポーネント定義のそれぞれについてコールされ、表示が完了したことを通知します。これにより、フレームワークの表示サービスが DOM 要素を挿入した後、DOM ツリーを操作できます。
  4. クライアントがサーバ要求 XHR への応答の待機を終了したことを示すために、doneWaiting イベントが起動されます。このイベントは、クライアント側コントローラアクションに結び付けられたハンドラを追加することで処理できます。
  5. フレームワークは、再表示が必要なコンポーネントがあるかどうか確認し、属性値の更新を反映する場合など、「汚れた」 (更新が必要な) コンポーネントがあれば再表示します。最後に、doneRendering イベントが表示ライフサイクルの終了時に起動されます。
ui:button コンポーネントがサーバから返されたときに何が起こるかと、ボタンがクリックされてその表示ラベルが更新されたときに行われる再表示について見てみましょう。
1swfobject.registerObject("clippy.codeblock-1", "9");<!-- The uiExamples:buttonExample container component -->
2<aura:component>
3    <aura:attribute name="num" type="Integer" default="0"/>
4    <ui:button aura:id="button" label="{!v.num}" press="{!c.update}"/>
5</aura:component>
1swfobject.registerObject("clippy.codeblock-2", "9");/** Client-side Controller **/
2({
3    update : function(cmp, evt) {
4        cmp.set("v.num", cmp.get("v.num")+1);
5    }
6})

ui:button のソースを参照すると、表示されるコンポーネント定義を理解するのに役立ちます。詳細は、https://github.com/forcedotcom/aura/blob/master/aura-components/src/main/components/ui/button/button.cmp を参照してください。また、マークアップの HTML タグは <aura:html> タグに変換されます。

メモ

初期化の後、render() がコールされて ui:button が表示されます。ui:button にはカスタムレンダラはなく、render() という基本実装を使用します。この例では、render() が次の順序で 8 回コールされます。
コンポーネント 説明
uiExamples:buttonExample ui:button コンポーネントが含まれる最上位コンポーネント
ui:button 最上位コンポーネントに含まれる ui:button コンポーネント
aura:html <button> タグを表示します。
aura:if ui:button の最初の aura:if タグ。ボタンには画像が含まれていないため、何も表示されません。
aura:if ui:button の 2 つ目の aura:if タグ
aura:html <button> タグにネストされた、ボタンの表示ラベル用の <span> タグ
aura:expression v.num
aura:expression 空の v.body

この例では、表示が完了すると、これらのコンポーネント定義について afterRender() が 8 回コールされます。doneWaiting イベントが起動され、その後に doneRendering イベントが起動されます。

ボタンをクリックするとその表示ラベルが更新され、更新が必要なコンポーネントがチェックされます。rerender() が起動されて、それらのコンポーネントが再表示され、その後に doneRendering イベントが起動されます。この例では、rerender() が 8 回コールされます。変更された値はすべて表示サービスのリストに保存され、更新が必要なコンポーネントがあれば再表示されます。

カスタムレンダラでイベントを起動することはお勧めしません。詳細は、「イベントのアンチパターン」を参照してください。

メモ

ネストされたコンポーネントの表示

myApp.app というアプリケーションに ui:myCmp コンポーネントが含まれ、そのコンポーネントに ui:button コンポーネントが含まれるとします。ネストされたコンポーネントは特定の順序で表示されます。

初期化中、init() イベントは、ui:myCmpui:buttonmyApp.app の順序で起動されます。doneWaiting イベントが同じ順序で起動されます。最後に、doneRendering イベントも同じ順序で起動されます。

doneWaiting ハンドラのカスタマイズ

doneWaiting イベントは、クライアントがサーバ要求への応答の待機を終了したことを通知するために起動されますが、場合によってはその前に waiting イベントが起動されます。waiting イベントは、アクションがサーバに送信されると起動されます。たとえば、サーバ側アクションが $A.enqueueAction() を使用して追加され、その後に実行される場合などです。このイベントをリスンするには、次の構文を使用してコントローラロジックを追加します。
1swfobject.registerObject("clippy.codeblock-3", "9");<aura:handler event="aura:waiting" action="{!c.waiting}"/>
2<aura:handler event="aura:doneWaiting" action="{!c.doneWaiting}"/>
たとえば、waiting イベントの間にスピナーを表示し、doneWaiting イベントが起動されたら非表示にする場合などがあります。次の例では、起動されるイベントに応じて CSS クラスを追加または削除します。
1swfobject.registerObject("clippy.codeblock-4", "9");({
2  waiting: function(cmp, event, helper) {
3    $A.util.addClass(cmp.find("spinner").getElement(), "waiting");
4  },
5  doneWaiting: function(cmp, event, helper) {
6    $A.util.removeClass(cmp.find("spinner").getElement(), "waiting");
7  }
8})

doneRendering ハンドラのカスタマイズ

このイベントをリスンするには、次の構文を使用します。また、コントローラロジックを追加できます。
1swfobject.registerObject("clippy.codeblock-5", "9");<aura:handler event="aura:doneRendering" action="{!c.doneRendering}"/>
たとえば、アプリケーションが初回の表示を完了した後の動作をカスタマイズし、その後の再表示時の動作はカスタマイズしないとします。初回の表示かどうか判定するための属性を作成します。
1swfobject.registerObject("clippy.codeblock-6", "9");<aura:attribute name="isDoneRendering" type="Boolean" default="false"/>
1swfobject.registerObject("clippy.codeblock-7", "9");({
2  doneRendering: function(cmp, event, helper) {
3    if(!cmp.get("v.isDoneRendering")){
4      //do something after app is first rendered
5    }
6  }
7})