你可以阻止VisualForce组件渲染,直到它的内容变得可见?

时间:2012-11-06 22:35:51

标签: ajax salesforce apex-code visualforce

我有一个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>   

是否可以阻止页面在secondComponent(包含在tab2中)中运行代码,直到用户实际点击第二个选项卡为止?

这是一个更具体问题的特定情况:是否可以在首次加载时不运行页面上的所有代码,只在用户执行特定操作时运行它。

(想要这样做的一个原因是减少页面上的查询数量以避免达到限制。)

1 个答案:

答案 0 :(得分:1)

我认为它可以按你的需要工作!您可能在构造函数中有太多逻辑。并component's constructor HAS TO execute

检查此示例,它适用于我(意味着仅当我导航到第二个选项卡时才会抛出异常)。

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;
}

我知道它看起来很疯狂,但它是valid syntax since 2008;)您还可以进行传统的getMyData()通话。

这是一个偏好问题,但我尽量让我的构造函数尽可能薄,只有基本的初始化。如果我开始提取所有类型的东西,这意味着每次可能不需要所有数据的最终用户会有延迟。

关于在用户执行操作时运行代码的更通用的问题 - 有各种各样的标签&amp;选项:commandButtons,commandLinks,actionSupport,actionFunction,JavaScript remoting ......我不打算粘贴所有链接,但有大量的例子,其中最重要的是http://wiki.developerforce.com/page/Visualforce_DynamicEditPage