2012-11-06 32 views
0

我有一個包含兩個組件這是一個選項卡每個裏面,像這樣的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),直到用戶實際上點擊第二個標籤?

這是一個更具一般性問題的特定情況:是否有可能在第一次加載時不運行頁面上的所有代碼,並且只有在用戶執行特定操作時才運行它。

(對於想要做到這一點的原因之一是減少查詢的數量在頁面上避免撞上了極限。)

+0

聽起來就像你在懶惰加載後(http://www.appelsiini.net/projects/lazyload,但我認爲它只適用於圖像)。某種onload/onfocus/onclick事件? apex:actionSupport標籤?另外 - 閱讀關於'rendered'屬性(存在於大多數標籤上;設想一個搜索表單,並且只在'rendered = {!results.size> 0}'和'rerender'時顯示pageBlockTable(當commandbutton或commandlink被使用時有用並且該頁面已提交,只需刷新頁面的一部分) – eyescream

+0

好的想法,但不幸的是,當我查看日誌時,它看起來像代碼在使用rendered =「false」時仍然執行,它只是不顯示輸出。 –

回答

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()電話。

這是一個偏好問題,但我嘗試使我的構造函數儘可能薄,只有基本的初始化。如果我開始提取所有類型的東西,這意味着最終用戶可能不會每次都需要所有數據。

至於用戶執行操作時運行代碼的更一般問題 - 有一系列標籤&選項:commandButtons,commandLinks,actionSupport,actionFunction,JavaScript遠程處理...我不打算粘貼所有鏈接但有很多例子,其中最不重要的是http://wiki.developerforce.com/page/Visualforce_DynamicEditPage

+0

您確切地確定了問題;代碼正在運行,因爲它在構造函數中。謝謝! –

+1

糟糕,畢竟這不是問題。問題是標籤中的變量總是在每個標籤頁中首次加載時進行評估。下面是一個例子,略有你提供了什麼修改: –

+0

'公共類tabTest { \t \t公開名單 myData的{ \t獲得{ \t如果(MYDATA的== NULL){ \t MYDATA的= [選擇ID,姓氏FROM Contact LIMIT 5]; \t throw new exampleException('那不是小行星,它是一個空間站。'); \t} \t return myData; \t} \t private set; \t} \t \t 公共類exampleException延伸異常{} }' –

相關問題