2012-01-24 48 views
2

我想驗證ui:repeat中的多個組件。如何從SiteBean中的`ui:repeat`獲取`UIInput`?

如何在SiteBean中從ui:repeat獲得UIInput

JSF代碼:

<f:event listener="#{siteBean.listenerMyListener}" type="preValidate" /> 
    <ez:inputText id="txtMY" required="true" value="Hallo" /> 

    <ui:repeat 
     id ="myRepeat" 
     var="item" 
     value="#{siteBean.myList}" 
     varStatus="status"> 

     <ez:panel style="margin-bottom: 7px; #{status.even ? 'background-color: #E6EFC2;' : 'background-color: #e5f1fa;'}"> 

      <h:messages for="hiddenValidation" /> 
      <h:inputHidden id="hiddenValidation" value="" /> 

      <h:outputText value="Rechnung vom:" /> 
      <ez:inputText id="txtDatum" value="#{item.datum}" 
          style="width: 100px; text-align: right;"> 
       <f:convertDateTime pattern="dd.MM.yyyy" /> 
      </ez:inputText> 

      <br /><br /> 

      <h:outputText value="Netto:" /> 
      <ez:inputText id="txtNetto" required="true" value="#{item.netto}" style="width: 100px; text-align: right;"> 
       <f:convertNumber pattern="###0.00" /> 
       <f:validateBean /> 
      </ez:inputText> 

      <br /><br /> 

      <h:outputText value="Brutto:" /> 
      <ez:inputText id="txtBrutto" required="true" value="#{item.brutto}" style="width: 100px; text-align: right;"> 
       <f:convertNumber pattern="###0.00" /> 
      </ez:inputText> 

     </ez:panel> 

    </ui:repeat> 

豆代碼:

public void listenerMyListener(ComponentSystemEvent event) { 

    FacesContext context = FacesContext.getCurrentInstance(); 

    UIComponent components = event.getComponent(); 


    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 


    UIInput search_txtMY = (UIInput) viewRoot.findComponent("frmMY:txtMY"); 
    String value_txtMY = search_txtMY.getLocalValue().toString(); // Hallo 


    UIInput search_txtDatum = (UIInput) viewRoot.findComponent("frmMY:myRepeat:0:txtDatum"); // NULL 
    String value_txtDatum = search_txtDatum.getLocalValue().toString(); // java.lang.NullPointerException 

} 
+1

據我所知,''內的組件不會被複制到JSF樹中。換句話說,你的'txtDatum'只有一個'UIInput'對象,它用於渲染所有的迭代。 – DRCB

+0

@DRCB謝謝。 – edze

回答

1

<ui:repeat>不是一個視圖生成時間標記,但視圖渲染時間標記。視圖樹中只有一個<h:inputText>組件,由frmMY:myRepeat:txtDatum標識。然而,它被多次渲染,迭代次數爲<ui:repeat>。如果您使用的是<c:forEach>,這是一個視圖編譯時間標記,那麼在視圖中確實存在多個組件,每個組件只會呈現一次。

您需要以不同的方式解決問題。 <c:forEach>可能不是正確的解決方案,因爲它可能具有令人討厭的「副作用」,具體取決於您的整個視圖和模型的設計方式。由於功能要求不明確,需要在系統事件監聽器中收集輸入值沒有任何意義(我想不出任何明智的現實世界中的這種方法),但我不能提出任何解決方法它不同而且正確。我猜想,你只需要一個Validator

+0

我試試。我有我的輸入驗證器。但我只能驗證每個輸入。有沒有可能在這裏驗證多個字段與我的?沒有多個表單和噸提交按鈕?我的網站頂部和底部只有兩個提交按鈕。 – edze

+0

做我所需要的。謝謝:) – edze

+0

不客氣。 – BalusC

相關問題