2012-01-24 2 views
2

ui:repeat에 여러 구성 요소의 유효성을 검사하려고합니다.SiteBean의`ui : repeat`에서`UIInput`을 어떻게 얻을 수 있습니까?

UIInput을 SiteBean의 ui:repeat에서 어떻게 얻을 수 있습니까?

<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> 

콩 코드 :

JSF 코드는

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>가보기 빌드 시간 태그 아니지만,보기는 시간 태그를 렌더링합니다. 보기 트리에는 frmMY:myRepeat:txtDatum으로 식별되는 구성 요소가 하나만 있습니다. <h:inputText>입니다. 그러나 반복 횟수는 <ui:repeat>만큼 반복됩니다. 뷰 빌드 시간 태그 인 <c:forEach>을 사용하는 경우 실제로는 뷰에 여러 개의 <h:inputText> 구성 요소가 있으며 각 구성 요소는 한 번만 렌더링됩니다.

문제를 다르게 해결해야합니다. <c:forEach>은 전체보기 및 모델 설계 방식에 따라 불쾌한 "부작용"이있을 수 있으므로 올바른 솔루션이 아닐 수도 있습니다. 기능 요구 사항이 불분명하고 시스템 이벤트 리스너에서 입력 값을 수집해야하는 필요성이 없기 때문에 (나는이 접근법의 실제 현실적인 적용을 생각할 수 없다), 해결 방법을 제안 할 수는 없다. 그것은 다르고 적절하게. I 을 입력하면 Validator이 필요합니다.

+0

시도해보십시오 입니다. 입력에 대한 유효성 검사기가 있습니다. 하지만 하나의 입력에 대해서만 유효성을 검사 할 수 있습니다. 내 과 함께 여기에 여러 입력란의 유효성을 검사 할 수 있습니까? 여러 개의 양식과 버튼을 제출하지 않고도? 내 사이트의 상단과 하단에 버튼을 2 개만 제출합니다. – edze

+0

내가 원하는 것을하십시오. 고마워요. – edze

+0

. 천만에. – BalusC

관련 문제