我正在尝试在我的Seam应用程序(2.2.0)中进行条件渲染,根据条件显示两个不同的控件。
我使用s:fragment
标记与渲染属性,但我的问题是,我希望无论控件显示,具有相同的id:
<s:fragment render="${editable}">
<rich:calendar id="entityDate"..../>
</s:fragment>
<s:fragment render="${!editable}">
<h:outputText id="entityDate".../>
</s:fragment>
我的问题是,即使渲染属性设置为false,"不被渲染"元素被解析,我得到一个异常,因为重复的id。
我还尝试了标记<ui:remove>
,它在解析阶段之前有效地删除了元素,因此我可以有如下内容:
<span id="myId"/>
<ui:remove>
<span id="myId"/>
</ui:remove>
不幸的是,<ui:remove>
标签不允许条件逻辑。有人找到解决这个问题的方法了吗?
只有在使用JSTL <c:if>
等视图构建时间标记时才有可能。
<c:if test="#{editable}">
<rich:calendar id="entityDate" />
</c:if>
<c:if test="#{!editable}">
<h:outputText id="entityDate" />
</c:if>
(注意,这在可迭代的JSF组件中不起作用,例如<ui:repeat>
、<h:dataTable>
等等)
毕竟,我强烈建议利用disabled
属性,如果有必要的话,使用一个好的CSS镜头来隐藏输入字段的边界等等。它将最小化JSF视图样板代码。
<rich:calendar id="entityDate" disabled="#{!editable}" />
禁用的输入可以通过CSS属性选择器element[attribute]
单独设置样式,例如
input[disabled] {
border: 0;
}
上面的代码删除了带有disabled
属性的input
元素的边框,使其看起来像一个正常的输出文本。
"Solve"?这里没有什么要解决的:GUI中的两个元素不能具有相同的ID。几乎不自然或不健全?
这就像问:"我有一个数据库表,有两行,我希望它们都有相同的主键值,但不知何故我得到这些错误…有没有人成功地解决了这个问题并绕过了这些限制?
或者更接近的类比:"我有两个span,其中一个是不可见的(has style="display: none"),我希望它们都有相同的id -浏览器似乎不喜欢它,尽管其中一个span是不可见的"。
底线:无论渲染与否,每个组件仍然是视图树的一部分,因此有一个UNIQUE id。
我有一个怀疑,你想有一些"多态"的代码应该与当前可见的元素工作。对这样的代码使用ID是错误的。如果您向我们展示您的用例,我们可能会找到实现效果的正确方法。
我自己在seam环境中使用selenium,我建议尽可能使用已定义的id。首先,您可以创建更小的id,这对页面大小很有用。其次,如果使用id而不是其他选择器来引用,那么selenium测试的运行速度会快得多。我还没有找到一个不能处理不同id的selenium测试。此外,如果代码在jsf树创建中失败,您可以看到哪个id失败。
我看到你是使用sfragment与可编辑与否。例如,我使用装饰并给装饰一个id,然后"just"ed作为输入,vi作为输出文本。这使得在selenium中很容易检查编辑或视图组件的可用性。
您是否能够通过将id标签放在片段上获得相同的结果?所以:
<s:fragment id="entityDate">
<rich:calendar render="${editable}" />
<h:outputText render="${!editable}" />
</s:fragment>