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 中的绑定的主要内容,如果未能解决你的问题,请参考以下文章