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

動的コンポーネントの遅延作成

デフォルトでは、動的コンポーネントを定義する Apex メソッドは、ページに定義された action メソッドが実行される前に、ページの読み込み時に実行されます。ページアクションが完了するまで待ってから、動的コンポーネントを作成するメソッドを実行するには、動的コンポーネントの invokeAfterAction 属性を true に設定します。これにより、たとえば、ページ初期化アクションまたはコールアウトの結果に応じて変化する動的コンポーネントを設計できます。
次に、動的コンポーネントを 1 つ含むページを次に示します。この動的コンポーネントは、ページの action メソッド pageActionUpdateMessage が完了した後に作成されます。
1<apex:page controller="DeferredDynamicComponentController" 
2    action="{!pageActionUpdateMessage}" showHeader="false">
3    
4    <apex:dynamicComponent componentValue="{!dynamicComp}" invokeAfterAction="true"/>
5  
6</apex:page>
次に、動的コンポーネント定義を提供する関連付けられたコントローラー、および invokeAfterAction 属性の影響を示します。
1public class DeferredDynamicComponentController {
2
3    private String msgText { get; set; }
4
5    public DeferredDynamicComponentController() {  
6        this.msgText = 'The controller is constructed.';
7    }
8    
9    public Component.Apex.OutputPanel getDynamicComp() {
10
11        // This is the component to return
12        Component.Apex.OutputPanel dynOutPanel= new Component.Apex.OutputPanel();
13        dynOutPanel.layout = 'block';
14        
15        // Child component to hold the message text
16        Component.Apex.OutputText msgOutput = new Component.Apex.OutputText();
17        msgOutput.value = this.msgText;
18        dynOutPanel.childComponents.add(msgOutput);
19        
20        return dynOutPanel;
21    }
22    
23    public Object pageActionUpdateMessage() {
24        this.msgText= 'The page action method has been run.';
25        return null;
26    }
27}
動的コンポーネントのデフォルトの動作では、コンストラクターで設定されている msgText 値は動的コンポーネントによって表示されます。動的コンポーネントに invokeAfterAction="true" を設定にすることにより、この動作が変更されます。このページは pageActionUpdateMethod が完了するまで待ち、その後で動的コンポーネントを作成します。したがって、コンポーネントには、代わりに pageActionUpdateMessage アクションメソッドで設定されている msgText の値が表示されます。

invokeAfterAction 属性は、API バージョン 31.0 以降に設定されたページの動的コンポーネントで使用できます。

メモ

動的コンポーネントおよびその他のアクションの遅延作成

invokeAfterAction="true" は、ページアクションの実行時であるページ読み込みの直後に動的コンポーネントに作用します。invokeAfterAction="true" を設定すると、ページ上のコンポーネント作成およびすべての action メソッドの順序が逆になります。つまり、次のすべてのコンポーネントに対する action メソッドの実行順序が変更されます。
  • <apex:actionFunction>
  • <apex:actionPoller>
  • <apex:actionSupport>
  • <apex:commandButton>
  • <apex:commandLink>
  • <apex:page>
動的コンポーネントに対して invokeAfterAction="false" が設定されている場合、実行順序は次のようになります。これは、動的コンポーネントのデフォルトの動作です。
  1. 動的コンポーネントの作成メソッドを呼び出し、コンポーネントが構成されます。
  2. action メソッドを呼び出します。
  3. ページを再表示します。
動的コンポーネントに対して invokeAfterAction="true" が設定されている場合、実行順序は次のようになります。
  1. action メソッドを呼び出します。
  2. 動的コンポーネントの作成メソッドを呼び出し、コンポーネントが構成されます。
  3. ページを再表示します。

2 つ目のケースでは、action メソッドで PageReference が返されると、Visualforce は要求を新しいページにリダイレクトし、動的コンポーネントの作成メソッドは実行されません。実行順序のバグが発生するのを避けるためのベストプラクティスは、動的コンポーネントを作成するメソッドに副次的影響がないようにすることです。

メモ