c:forEach中的绑定

时间:2016-07-26 16:41:34

标签: jsf

我有一组项目,每个项目都有最小值,可能值和最大值。有验证器可确保最大值大于最小值等。验证器使用绑定,以便它们可以比较用户输入的所有三个值。最初他们是在一个ui:重复,但这导致下拉的麻烦,我发现切换到c:forEach修复它。不幸的是,它也搞砸了绑定。我希望有一种方法可以修复它们而不必回到ui:重复。

是否可以在c:forEach中绑定?是否有某种方法可以为绑定添加id或varStatus索引,因此列表中的每个项目都不相同?例如在下面的示例中,我尝试过像

这样的事情
<h:inputText id="impactMin_#{impact.id}" binding="#{impactMin_#{impact.id}}">
<h:inputText id="impactMin_#{impact.id}" binding="#{impactMin}_#{impact.id}">

但不出所料,那些不能工作的人。如果有人知道这样做的合理方式,我会非常感激听到它。

这是代码的简化版本:

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

1 个答案:

答案 0 :(得分:0)

在尝试更好地理解绑定时,我找到了这个答案JSF 2 composites and binding for validation。虽然不完全相同,但我发现它可以适应c:forEach,就像这样:

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

注意顶部附近的ui:param位。这似乎可以解决问题。谢谢BalusC!