【问题标题】:Have JSF tag NOT render an HTML tag让 JSF 标记不呈现 HTML 标记
【发布时间】:2012-01-26 11:08:11
【问题描述】:

我为一个 JSF 团队做前端 HTML。我经常遇到被用来呈现自己的 HTML 的 JSF 标记。它通常是 SPAN,通常不是问题,但有时我们会遇到这样的情况:

<table>
<h:panelGroup rendered="[jsf logic]">
    <tr><td>#{jsfVariable}</td></tr>
</h:panelGroup>
</table>

这将呈现这个:

<table>
<span>
    <tr><td>Hello World.</td></tr>
</span>
</table>

我一直在阅读 JSF 标记文档,但找不到具体的方法来告诉 JSF 标记只呈现子 HTML,而不是将标记本身呈现为 HTML 元素。是否有一个 JSF 属性告诉它“不呈现跨度”?或者是否有一个不会呈现为 HTML,但仍允许在其中使用 JSF 变量的 JSF 标记?

【问题讨论】:

  • 我意识到您可能正在做一些更复杂的事情,但为什么不直接使用 -> ...td>。 .. 或者,您可以编写一个自定义组件,该组件有子组件,但什么也不渲染,但这对于一些可能很容易解决的事情(复合组件或简单的 html 重新设计)来说似乎需要做很多工作
  • 是的,这就是简化示例的问题。 ;) 我同意,在这个具体的例子中,你的解决方案非常有意义。但是是的,在实际使用中,我们的代码通常要复杂得多。

标签: html jsf


【解决方案1】:

&lt;span&gt; 仅在您为 &lt;h:panelGroup&gt; 提供 必须 以 HTML 结尾的属性时生成,例如 id、styleClass 等。在您给定的示例中, &lt;h:panelGroup&gt; 只有一个 rendered 属性,因此不会为 HTML 生成任何内容。

因此,要满足您的要求,只需从&lt;h:panelGroup&gt; 中删除除rendered 之外的所有属性,就像您在自己的问题示例中所做的那样。

【讨论】:

  • 事后看来有些明显!不过,我从未在我读过的任何文档中看到过这一点。谢谢!
  • 不客气。如果您使用 JSP 的后续 Facelets 而不是 JSP,那么可以使用 &lt;ui:fragment&gt;。它没有 HTML 属性,因此您不能“意外”指定任何一个。
  • 这仅对静态标记有效。如果我想通过 ajax 更新 &lt;tr&gt; 以更新其渲染状态怎么办?我找到的唯一解决方案是更新整个表格或行的单元格中的所有组件。 Mojarra 在表格上方呈现span 导致错误更新。 &lt;h:panelGroup id="pnl"&gt;&lt;h:panelGroup rendered="#{value}"&gt;&lt;tr&gt;...&lt;/tr&gt;&lt;/h:panelGroup&gt;&lt;/h:panelGroup&gt; 不工作。
  • @djmj:OmniFaces 有一个Ajax#updateRow(),您可能会觉得有帮助。
  • 看起来很适合使用数据绑定重复数据。我有条件地希望根据其他输入数据/选择来渲染/更新带有输入组件的 html 行。 Primefaces panelGrid 看起来很有希望,即使我更喜欢简单的 html,如果不需要设计。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2015-03-29
  • 2011-01-13
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多