2014-05-12 18 views
0

解僱這是我的escenario:值錯誤的客戶端ID叫UIData.getClientId在action方法UIColumn

一個H:dataTable中與備份豆一HtmlDataTable對象綁定。 在由h:列內部的命令按鈕觸發的操作方法中爲HtmlDataTable調用getClientId將數據表ID和行索引作爲clientId。 如果數據表ID是'table',則getClientId()返回表:0(或表:1,表:2 ...,具體取決於命令按鈕所在的行索引)

我期望得到只是'表'作爲clientId,因爲綁定的表總是相同的。

當我使用數據表之外的按鈕調用同一個方法時,我得到'table'。這對我來說是正確的,但我不明白爲什麼如果動作來自一個UIColumn按鈕,我得到了table:rowIndex。

JSF頁面是:

<h:form prependId="false"> 
     <h:dataTable id="table" value="#{sessionBean.dummyData}" var="row" binding="#{sessionBean.dataTable}"> 
      <h:column> 
       <f:facet name="header"> 
        ROW ID 
       </f:facet> 
       #{row.longValue()} 
      </h:column> 

      <h:column> 
       <f:facet name="header"> 
        ACTION 1 
       </f:facet> 
       <h:commandButton id="btn1" value="REFRESH CLIENT FROM UIColumn" > 
        <f:ajax execute="@this" render="output" listener="#{sessionBean.testAction()}" /> 
       </h:commandButton> 
      </h:column> 
     </h:dataTable> 

     <h:commandButton id="btn2" value="REFRESH CLIENT outside from data table" > 
        <f:ajax execute="@this" render="output" listener="#{sessionBean.testAction()}" /> 
     </h:commandButton> 


     <h:outputText id="output" value="#{sessionBean.clientId}" /> 
    </h:form> 

的bean:

@ManagedBean 
@SessionScoped 
public class SessionBean { 
    private List<Long> dummyData; 
    private String clientId; 
    private HtmlDataTable dataTable; 


    public SessionBean() { 
     dummyData = new ArrayList<Long>(); 
    } 

    @PostConstruct 
    public void postConstruct(){ 
     for(int i = 0; i < 5; i++){ 
      dummyData.add(new Long(i)); 
     } 
    } 

    public String getClientId() { 
     return clientId; 
    } 

    public void setClientId(String clientId) { 
     this.clientId = clientId; 
    } 

    public void testAction(){ 
     clientId = this.dataTable.getClientId(); 
    } 

    public List<Long> getDummyData() { 
     return dummyData; 
    } 

    public void setDummyData(List<Long> dummyData) { 
     this.dummyData = dummyData; 
    } 

    public HtmlDataTable getDataTable() { 
     return dataTable; 
    } 

    public void setDataTable(HtmlDataTable dataTable) { 
     this.dataTable = dataTable; 
    } 
} 

在此先感謝。我想知道這是否是正常的JSF行爲。

回答

1

我已經做了一些JSF代碼挖掘,是的,似乎他們已經故意設計它以這種方式工作。在服務器上的JSF生命週期處理期間,HtmlDataTable對象的clientId會不斷更改,因爲它包含「當前選定」行的索引。並且,在調用Ajax處理程序(即'testAction'方法)之前的'Invoke Application'生命週期階段,JSF框架將HtmlDataTable的行索引設置爲與點擊按鈕所在的行相對應。

據我所知,從UIData::getClientId(FacesContext)方法(它由HtmlDataTable繼承)的JavaDoc中,將行索引包含在UIData組件的clientId中的基本原理是避免屬於不同子組件的clientId衝突行。