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

コンポーネントの動的な作成

$A.createComponent() メソッドを使用して、クライアント側の JavaScript コードでコンポーネントを動的に作成します。

廃止された newComponent()newComponentAsync()newComponentDeprecated() メソッドの代わりに、createComponent() メソッドを使用します。

メモ

構文は次のとおりです。

1createComponent(String type, Object attributes, function callback)
  1. type — 作成するコンポーネントの種類 ("ui:button" など)。
  2. attributes — コンポーネントの属性の対応付け。ローカル ID (aura:id) を含みます。
  3. callback — コンポーネントの作成後に呼び出すコールバック。新しいコンポーネントがパラメータとしてコールバックに渡されます。

動的に作成されたボタンを次のサンプルコンポーネントに追加してみましょう。

1<!--docsample:createComponent-->
2<aura:component>
3    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
4
5    <p>Dynamically created button</p>
6    {!v.body}
7
8</aura:component>

クライアント側のコントローラは、$A.createComponent() をコールして、press イベントのローカル ID とハンドラを含むボタンを作成します。docsample:createComponentbody にボタンが追加されます。

1/*createComponentController.js*/
2({
3    doInit : function(cmp) {
4        $A.createComponent(
5            "ui:button",
6            {
7                "aura:id": "findableAuraId",
8                "label": "Press Me",
9                "press": cmp.getReference("c.handlePress")
10            },
11            function(newButton){
12                //Add the new button to the body array
13                if (cmp.isValid()) {
14                    var body = cmp.get("v.body");
15                    body.push(newButton);
16                    cmp.set("v.body", body);
17                }
18            }
19        );
20    },
21
22    handlePress : function(cmp) {
23        console.log("button pressed");
24    }
25})

docsample:createComponent には、{!v.body} 式が含まれています。cmp.set("v.body", ...) を使用してコンポーネントのボディを設定するときは、コンポーネントマークアップに {!v.body} を明示的に含める必要があります。

メモ

作成した新しいボタンを取得するには、body[0] を使用します。
1var newbody = cmp.get("v.body");
2var newCmp = newbody[0].find("findableAuraId");

ネストしたコンポーネントの作成

別のコンポーネントのボディにコンポーネントを動的に作成するには、$A.createComponents() を使用してコンポーネントを作成します。関数コールバックで、外部コンポーネントの body に内部コンポーネントを設定して、コンポーネントをネストします。次の例では、ui:message コンポーネントの bodyui:outputText コンポーネントを作成します。

1$A.createComponents([
2    ["ui:message",{
3        "title" : "Sample Thrown Error",
4        "severity" : "error",
5    }],
6    ["ui:outputText",{
7        "value" : e.message
8    }]
9    ],
10    function(components, status){
11        if (status === "SUCCESS") {
12            var message = components[0];
13            var outputText = components[1];
14            // set the body of the ui:message to be the ui:outputText
15            message.set("v.body", outputText);
16        }
17    }
18);

連動関係の宣言

このフレームワークでは、コンポーネントなどの定義間の連動関係が自動的に追跡されます。ただし、フレームワークで簡単に検出できない連動関係もあります。たとえば、コンポーネントのマークアップで直接参照されていないコンポーネントを動的に作成する場合などがこれに該当します。こうした動的な連動関係をフレームワークが把握できるようにするには、<aura:dependency> タグを使用します。これにより、必要に応じてコンポーネントとその連動関係がクライアントに送信されます。

サーバ側の連動関係

createComponent() メソッドでは、クライアント側のコンポーネントの作成とサーバ側のコンポーネントの作成の両方がサポートされています。サーバ側の連動関係が見つからない場合、このメソッドは同期して実行されます。コンポーネントの作成にサーバ要求が必要かどうかは、最上位コンポーネントで判別されます。

最上位コンポーネントにサーバ側の連動関係はないが、ネストされた内部コンポーネントに連動関係があるコンポーネントの作成は、現在サポートされていません。

メモ

コントローラアクションがコールされるのはコンポーネントが作成された後のみであるため、コンポーネントの作成では、サーバ側のコントローラはサーバ側の連動関係にはなりません。

サーバ側の連動関係があるコンポーネントは、事前に読み込まれている場合でも、そのサーバで作成されます。サーバ側の連動関係がなく、連動関係の事前の読み込みまたは宣言によってその定義がすでにクライアントに存在している場合、サーバコールは実行されません。サーバ要求を強制するには、forceServer パラメータを true に設定します。