我有一个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中)中运行代码,直到用户实际点击第二个选项卡为止?
这是一个更具体问题的特定情况:是否可以在首次加载时不运行页面上的所有代码,只在用户执行特定操作时运行它。
(想要这样做的一个原因是减少页面上的查询数量以避免达到限制。)
答案 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。