我正在尝试在我的Seam应用程序(2.2.0)中进行条件渲染,根据条件显示两个不同的控件。
我正在使用带有render属性的s:fragment
标记,但我的问题是我想要显示的控件,具有相同的id:
<s:fragment render="${editable}">
<rich:calendar id="entityDate"..../>
</s:fragment>
<s:fragment render="${!editable}">
<h:outputText id="entityDate".../>
</s:fragment>
我的问题是,即使将render属性设置为false,也会解析“not to be rendered”元素,并且由于重复的id而出现异常。
我也尝试使用标签<ui:remove>
,它在解析阶段之前有效地删除了元素,所以我可以这样:
<span id="myId"/>
<ui:remove>
<span id="myId"/>
</ui:remove>
不幸的是<ui:remove>
标记不允许条件逻辑。有没有人找到解决这个问题的方法?
答案 0 :(得分:3)
仅当您使用JSTL <c:if>
等视图构建时标记时才可以使用。
<c:if test="#{editable}">
<rich:calendar id="entityDate" />
</c:if>
<c:if test="#{!editable}">
<h:outputText id="entityDate" />
</c:if>
(请注意,这不适用于iterablte JSF组件,例如<ui:repeat>
,<h:dataTable>
等等。
毕竟,我强烈建议您使用disabled
属性,如果需要,可以使用CSS来隐藏输入字段边框等等。它将最小化JSF视图样板代码。
<rich:calendar id="entityDate" disabled="#{!editable}" />
禁用的输入可以通过CSS属性选择器element[attribute]
单独设置样式,例如
input[disabled] {
border: 0;
}
上面删除了input
元素的边框,其中包含disabled
属性,使其看起来像普通的输出文本。
答案 1 :(得分:0)
“解决”?这里没有什么可解决的:GUI中的两个元素不能具有相同的ID。几乎不自然或不健全?
这就像问:“我有一个包含两行的数据库表,我希望它们都具有相同的主键值,但不知怎的,我得到这些错误......有人设法解决问题并规避约束?”。
或者更接近类比:“我有两个跨度,其中一个是隐形的(有style =”display:none“)我希望它们都具有相同的ID - 并且浏览器似乎不喜欢它,尽管有一个跨度是看不见的“。
底线:渲染时未渲染,每个组件仍然是视图树的一部分,因此具有唯一ID。
我怀疑你想要一些应该与当前可见元素一起使用的“多态”代码。使用ID代码是错误的。如果您向我们展示您的用例,我们可能会找到一种正确的方法来实现这种效果。
答案 2 :(得分:0)
我自己在缝隙环境中使用selenuim,我建议尽可能使用定义的ID。首先,您可以创建较小的ID,这对于页面大小非常有用。其次,如果使用id进行引用而不是其他选择器,那么selenium测试运行速度会更快。我还没有找到硒测试,你无法处理不同的ID。此外,如果代码在jsf树创建中失败,您将看到哪个ID失败。
我看到你正在使用带有可编辑的sfragment。我使用sdecorate并给装饰一个id,然后输入“just”ed和输出文件的vi。这使得在selenium中可以轻松检查编辑或查看组件的可用性。
答案 3 :(得分:0)
您是否可以通过在片段上添加id标记来获得所需的相同结果? 所以:
<s:fragment id="entityDate">
<rich:calendar render="${editable}" />
<h:outputText render="${!editable}" />
</s:fragment>