2016-07-26 14 views
0

Ich habe eine Sammlung von Elementen, die jeweils eine minimale, wahrscheinliche und maximale Wert haben. Es gibt Validatoren, um sicherzustellen, dass das Maximum größer als das Minimum usw. ist. Die Validierer verwenden Bindungen, um alle drei Werte, die der Benutzer eingegeben hat, zu vergleichen. Ursprünglich waren sie in einem UI: wiederholen, aber das verursachte Probleme mit einem Dropdown und ich fand Wechsel zu einem c: forEach repariert es. Leider hat es auch die Bindungen durcheinander gebracht. Ich hoffe, es gibt einen Weg, sie zu reparieren, ohne ins UI zurückzukehren: wiederhole es.Bindungen in c: forEach

Ist es möglich, eine Bindung in einem c: forEach zu haben? Gibt es eine Möglichkeit, der Bindung eine ID oder einen varStatus-Index hinzuzufügen, sodass sie nicht für alle Elemente in der Liste identisch ist? z.B. Im Beispiel unten habe ich Dinge wie

<h:inputText id="impactMin_#{impact.id}" binding="#{impactMin_#{impact.id}}"> 
<h:inputText id="impactMin_#{impact.id}" binding="#{impactMin}_#{impact.id}"> 

versucht, aber nicht überraschend, die nicht funktionieren. Wenn jemand einen vernünftigen Weg kennt, dies zu tun, wäre ich sehr dankbar, das zu hören.

Dies ist eine vereinfachte Version des Codes:

<c:forEach id="impacts" var="impact" items="#{mybean.impacts}" varStatus="i"> 
    <h:panelGroup layout="block" id="impactContainer_#{impact.id}"> 
     <h:outputText value="#{impact.score_impact_type_idInterface.score_impact_type_name}"/> 
     <h:panelGroup layout="block" class="row form-group" id="impactAssessment_#{impact.id}"> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMin" value="#{impact.current_impact_min}" binding="#{impactMin}" label="Minimum"> 
        <f:attribute name="impactMl" value="#{impactMl}"/> 
        <f:attribute name="impactMax" value="#{impactMax}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactMinValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMl" value="#{impact.current_impact_ml}" binding="#{impactMl}" label="Most likely"> 
        <f:attribute name="impactMin" value="#{impactMin}"/> 
        <f:attribute name="impactMax" value="#{impactMax}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactLikelyValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMax" value="#{impact.current_impact_max}" binding="#{impactMax}" label="Maximum"> 
        <f:attribute name="impactMin" value="#{impactMin}"/> 
        <f:attribute name="impactMl" value="#{impactMl}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactMaxValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <div class="col-sm-12"> 
       <h:message for="impactMin"/> 
       <h:message for="impactMl"/> 
       <h:message for="impactMax"/> 
      </div> 
     </h:panelGroup> 
    </h:panelGroup> 
</c:forEach> 

Antwort

0

Bei dem Versuch, ein besseres Verständnis der Bindungen im Allgemeinen zu bekommen, fand ich diese Antwort JSF 2 composites and binding for validation. Zwar nicht ganz dasselbe, fand ich es an einen c angepasst werden könnte: forEach wie folgt aus:

<c:forEach id="impacts" var="impact" items="#{mybean.impacts}" varStatus="i"> 
    <h:panelGroup layout="block" id="impactContainer_#{impact.id}"> 
     <h:outputText value="#{impact.score_impact_type_idInterface.score_impact_type_name}"/> 
     <h:panelGroup layout="block" class="row form-group" id="impactAssessment_#{impact.id}"> 
      <ui:param name="impactMin" value="impactMin_#{impact.id}" /> 
      <ui:param name="impactMl" value="impactMl_#{impact.id}" /> 
      <ui:param name="impactMax" value="impactMax_#{impact.id}" /> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMin_#{impact.id}" value="#{impact.current_impact_min}" binding="#{requestScope[impactMin]}" label="Minimum"> 
        <f:attribute name="impactMl" value="#{requestScope[impactMl]}"/> 
        <f:attribute name="impactMax" value="#{requestScope[impactMax]}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactMinValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMl_#{impact.id}" value="#{impact.current_impact_ml}" binding="#{requestScope[impactMl]}" label="Most likely"> 
        <f:attribute name="impactMin" value="#{requestScope[impactMin]}"/> 
        <f:attribute name="impactMax" value="#{requestScope[impactMax]}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactLikelyValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <h:panelGroup layout="block"> 
       <h:inputText id="impactMax_#{impact.id}" value="#{impact.current_impact_max}" binding="#{requestScope[impactMax]}" label="Maximum"> 
        <f:attribute name="impactMin" value="#{requestScope[impactMin]}"/> 
        <f:attribute name="impactMl" value="#{requestScope[impactMl]}"/> 
        <f:convertNumber locale="#{loginInfo.realLocale}" minIntegerDigits="1" maxFractionDigits="2" /> 
        <f:validator binding="#{impactMaxValidator}"/> 
       </h:inputText> 
      </h:panelGroup> 
      <div class="col-sm-12"> 
       <h:message for="impactMin_#{impact.id}"/> 
       <h:message for="impactMl_#{impact.id}"/> 
       <h:message for="impactMax_#{impact.id}"/> 
      </div> 
     </h:panelGroup> 
    </h:panelGroup> 
</c:forEach> 

Notiere die ui: param Bits in der Nähe der Spitze. Das scheint der Trick zu sein. Danke BalusC!