動的コンポーネントの遅延作成
デフォルトでは、動的コンポーネントを定義する 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 属性の影響を示します。
動的コンポーネントのデフォルトの動作では、コンストラクタで設定されている msgText 値は動的コンポーネントによって表示されます。動的コンポーネントに invokeAfterAction="true" を設定にすることにより、この動作が変更されます。ページで pageActionUpdateMethod が完了するまで待ってから、、動的コンポーネントが作成されます。したがって、コンポーネントには、代わりに pageActionUpdateMessage アクションメソッドで設定されている msgText の値が表示されます。
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}動的コンポーネントおよびその他のアクションの遅延作成
invokeAfterAction="true" は、ページアクションの実行時であるページ読み込みの直後に動的コンポーネントに作用します。invokeAfterAction="true" を設定すると、ページ上のコンポーネント作成およびすべての action メソッドの順序が逆になります。つまり、次のすべてのコンポーネントに対する action メソッドの実行順序が変更されます。
- <apex:actionFunction>
- <apex:actionPoller>
- <apex:actionSupport>
- <apex:commandButton>
- <apex:commandLink>
- <apex:page>
- <apex:togglePanel>
動的コンポーネントに対して invokeAfterAction="false" が設定されている場合、実行順序は次のようになります。これは、動的コンポーネントのデフォルトの動作です。
- 動的コンポーネントの作成メソッドを呼び出し、コンポーネントが構成されます。
- action メソッドを呼び出します。
- ページを再表示します。
動的コンポーネントに対して invokeAfterAction="true" が設定されている場合、実行順序は次のようになります。
- action メソッドを呼び出します。
- 動���コンポーネントの作成メソッドを呼び出し、コンポーネントが構成されます。
- ページを再表示します。