Seam条件渲染而不解析

时间:2011-08-17 21:06:41

标签: jsf richfaces seam

我正在尝试在我的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>标记不允许条件逻辑。有没有人找到解决这个问题的方法?

4 个答案:

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