c:forEach 中的绑定

Posted

技术标签:

【中文标题】c:forEach 中的绑定【英文标题】:Bindings in c:forEach 【发布时间】:2016-11-30 10:25:34 【问题描述】:

我有一个项目集合,每个项目都有一个最小值、可能值和最大值。有验证器来确保最大值大于最小值等。验证器使用绑定,因此他们可以比较用户输入的所有三个值。最初他们在 ui:repeat 中,但这导致下拉菜单出现问题,我发现切换到 c:forEach 修复了它。不幸的是,它也弄乱了绑定。我希望有一种方法可以在不返回 ui:repeat 的情况下修复它们。

是否可以在 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】:

在尝试更好地理解一般绑定时,我找到了这个答案 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!

【讨论】:

以上是关于c:forEach 中的绑定的主要内容,如果未能解决你的问题,请参考以下文章

c中foreach的用法

c:forEach 不遍历 TabView 中的列表

关于java中c标签foreach的用法?

关于java中c标签foreach的用法?

关于java中c标签foreach的用法?

如何遍历 <c:forEach> 中的嵌套映射