0

次のように、それぞれがタブ内にある 2 つのコンポーネントを含む VisualForce ページがあります。

<apex:tabpanel switchtype="ajax" selectedTab="tab1">
    <apex:tab label="First Tab" name="tab1" id="tab1">
     <c:firstComponent /> 
    </apex:tab>
    <apex:tab label="Second Tab" name="tab2" id="tab2">
    <c:secondComponent />
    </apex:tab>
</apex:tabpanel>   

ユーザーが実際に 2 番目のタブをクリックするまで、ページが secondComponent (tab2 に含まれる) のコードを実行しないようにすることは可能ですか?

これは、より一般的な質問の特定のケースです。ページが最初に読み込まれたときにすべてのコードを実行するのではなく、ユーザーが特定のアクションを実行したときにのみ実行することは可能ですか?

(これを行う理由の 1 つは、制限に達するのを避けるために、ページ上のクエリの数を減らすことです。)

4

1 に答える 1

1

思い通りに動くと思います!コンストラクターのロジックが多すぎる可能性があります。そして、コンポーネントのコンストラクターは実行する必要があります。

この例を確認してください。私にとってはうまくいきます(つまり、2番目のタブに移動したときにのみ例外がスローされます)。

public class tabTest{
    public Contact getContact(){
        throw new exampleException('That\'s no moon. It\'s a space station.');
    }
    public class exampleException extends Exception{}
}

<apex:page controller="tabTest">
    <apex:tabpanel switchtype="ajax" selectedTab="tab1">
        <apex:tab name="tab1" label="1st" >1</apex:tab>
        <apex:tab name="tab2" label="it's a trap!">{!contact.LastName}</apex:tab>
    </apex:tabpanel>
</apex:page>

コンストラクターが呼び出されたときに (メイン ページで、次に各コンポーネントに対して) 呼び出されるロジックがたくさんありますか? その一部をアクション メソッド (getter メソッドを返すもの:

public List<Contact> myData{
    get{
        if(myData == null){
            myData = [SELECT Id FROM Contact LIMIT 5];
        }
        return myData;
    }
    private set;
}

クレイジーに見えることはわかっていますが、2008 年以降は有効な構文ですgetMyData();) 従来の呼び出しを行うこともできます。

好みの問題ですが、基本的な初期化だけで、コンストラクターをできるだけ薄くしようとしています。あらゆる種類のものをフェッチし始めると、毎回すべてのデータを必要としないエンド ユーザーにとって遅延を意味します。

ユーザーがアクションを実行するときにコードを実行することに関するより一般的な質問については、タグとオプションの全範囲があります: commandButtons、commandLinks、actionSupport、actionFunction、JavaScript リモート処理...すべてのリンクを貼り付けるつもりはありませんが、たくさんあります例のうち、少なくともhttp://wiki.developerforce.com/page/Visualforce_DynamicEditPageです。

于 2012-11-07T20:29:16.213 に答える