2011-09-13 96 views
0

我目前正在接縫項目上工作並遇到問題。seam操作方法執行兩次?

我剛創建了一個新頁面(一個名爲MyPage.xhtml的xhtml)。 在XHTML我的代碼,你可以找到一個命令按鈕和AA:中繼器來顯示我的數據:

<!-- input fields that are filters for my table shown below --> 
<h:commandButton value="View details" action="/MyPage.xhtml"/> 

<rich:panel rendered=#{myAction.showDetails}> 
    <a:repeat value="#{myAction.findRecords()}" var="record"> 
     <!-- Some of my code to display a table, nothing fancy --> 
    </a:repeat> 
</rich:panel> 
在我的行動

我有這樣的:

@DataModel 
private List<MyEntity> records = new ArrayList<MyEntity>(); 

public List<MyEntity> findRecords() { 
    //Do some query 
    Query query = entityManager.createNamedQuery("myEntityQuery"); 
    records = query.getResultList(); 
    return records; 
} 

這是頁面是如何工作的:

  1. 我的輸入框和命令按鈕被顯示,而不是rich:panel,因爲我的showDetails布爾值爲false。
  2. 當showDetails布爾值設置爲true時,將顯示該面板並且迭代調用我的操作方法findRecords()。到現在爲止還挺好!
  3. 但是當我再次點擊我的動作按鈕時,動作方法findRecords()會執行兩次。這裏是我的問題...

爲什麼要執行兩次?我怎樣才能限制一次?現在它花費我們很多表現。!

氪,

德克

回答

0

最可能的是在視圖重建(恢復視圖相),並再次渲染期間執行該方法(渲染響應相)。

嘗試緩存方法是否已經執行或只有在單擊該按鈕時執行它並提供一個簡單的getter來傳遞數據。

作爲一般的注意,僅在需要時(高速緩存的結果),你應該做昂貴的操作,比如數據庫查詢或在調用應用程序階段(通常使用actionactionListener

0

我會做這樣的事情,而不是和使用存儲數據的範圍。如果在重複中使用這樣的函數,它將訪問重複中每一行的方法。

<h:commandButton value="View details" action="/MyPage.xhtml"/> 

<rich:panel rendered=#{myAction.showDetails}> 
    <a:repeat value="#{records}" var="record"> 
     <!-- Some of my code to display a table, nothing fancy --> 
    </a:repeat> 
</rich:panel> 



@Out 
private List<MyEntity> records = new ArrayList<MyEntity>(); 

@Factory(value="records") 
public void findRecords() { 
    //Do some query 
    Query query = entityManager.createNamedQuery("myEntityQuery"); 
    records = query.getResultList(); 
}