0

我有一个 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 中)中的代码?

这是一个更普遍的问题的特殊情况:是否可以在第一次加载页面时不运行页面上的所有代码,而仅在用户执行特定操作时运行它。

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

4

1 回答 1

1

我认为它可以按您的意愿工作!您可能在构造函数中有太多逻辑。并且组件的构造函数必须执行

检查这个例子,它对我有用(这意味着只有当我导航到第二个选项卡时才会引发异常)。

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 回答