2013-02-26 33 views
1

我正在從呈現屬性調用方法,其中我注意到該方法在RENDER_RESPONSE階段中被多次觸發。如果從渲染屬性調用多次調用方法

人們還注意到,該方法是在其他階段trigered多次(APPLY_REQUEST_VALUES,PROCESS_VALIDATIONS等)也。

我看到這裏這些呼叫背後的原因,被告知相關查詢(Why is the getter called so many times by the rendered attribute?)。

有沒有一種方法,我們可以控制這一點,因此,該方法被調用一次。

我使用

<rich:panelMenuItem label="Menu1" actionListener="#{testMenuMB.panelMenuClickedAjax}" rendered="#{testMenuMB.checkForRendering('RoleA,RoleB')}"></rich:panelMenuItem> 

public boolean checkForRendering(String rolesString){ 
System.out.println("Roles-->"+rolesString+FacesContext.getCurrentInstance().getCurrentPhaseId()); 
     boolean authorized = false; 
     String [] rolesArray = rolesString.split(","); 
     for (String string : rolesArray) { 
      if(string!=null && accesibleRolesMap.containsKey(string)){ 
       authorized = true; 
       break; 
      } 
     } 
     return authorized; 
    } 

回答

1

你無法控制的時候被調用的方法,它的生命週期framewroks的數量。您應該找到合適的位置來設置布爾值,例如on命令單擊action方法,在render方法中使用此布爾值,以便在action方法中執行一次邏輯並僅返回布爾值。

其他的事情是,你可以通過探測用於渲染響應當前生命週期階段與保護狀況,如果邏輯。

if(FacesContext.getCurrentInstance().getRenderResponse()){ 
    //logic 
} 

但我寧願選擇第一個選項。