不解析的接缝条件呈现

  • 本文关键字:条件 jsf richfaces seam
  • 更新时间 :
  • 英文 :


我正在尝试在我的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>

相关内容

  • 没有找到相关文章

最新更新