如何有条件地将某些内容封装在 HTML 元素中
Posted
技术标签:
【中文标题】如何有条件地将某些内容封装在 HTML 元素中【英文标题】:How can I envelope something in HTML element conditionally 【发布时间】:2016-04-18 10:43:20 【问题描述】:在使用 JSF、JSTL 和 Trinidad 创建的页面上,我有一些带有许多属性的标签。
<tr:selectBooleanRadio
group="#groupId"
id="#groupId_#Id_radio"
selected="#value.yesterday"
text="#msg.ib_selectTimeIntervalRadio_yesterday_label"
shortDesc="#ib:fn_coalesce(title,label)"
simple="#ib:fn_coalesce(simple,true)"
styleClass="#ib:fn_coalesce(styleClass,'selectTimeIntervalRadio')"/>
我想在<td>
元素中或直接有条件地显示它。现在我这样做:
<c:when test="#not horizontal">
<tr>
<td>
<tr....>
</td>
</tr>
</c:when>
<c:when test="#horizontal">
<tr...>
</c:when>
这样我重复同一段代码两次,这显然很糟糕。我能做什么?
恕我直言,为 tr... 调用创建一个新的自定义组件是没有用的 - 调用它会遇到所有相同的问题。
也许,我可以有条件地将一个标签封装在另一个标签中?可以吗?
另一种方式可能是:将 tr... 标记放在某种变量中,并在使用此变量构造时使用相同的标记。也许,有可能?
你知道如何避免这种重复代码的另一种方法吗?
【问题讨论】:
【参考方案1】:如果您使用的是旧版 JSP,请将其包装在 <f:verbatim>
中。
<f:verbatim rendered="#not horizontal"><tr><td></f:verbatim>
<tr:selectBooleanRadio ... />
<f:verbatim rendered="#not horizontal"></td></tr></f:verbatim>
如果您使用 JSPX 或 Facelets,这会在上述构造上产生 XML 错误,这在 XML 中是非法的,请将其转义为 <h:outputText escape="false">
。
<h:outputText value="<tr><td>" escape="false" rendered="#not horizontal" />
<tr:selectBooleanRadio ... />
<h:outputText value="</td></tr>" escape="false" rendered="#not horizontal" />
【讨论】:
最后我需要声明 xmlns:h="java.sun.com/jsf/html"。看起来很脏。第一个变体更令人同情,请问我对这个 f: 有什么要求? 如回答,它在 Facelets 中不起作用。顺便说一句,它只是标准的核心标签,自 JSF 2.0 起才被弃用。 我已经检查过了 它违反了 XML 规则(文档必须格式正确)。因此丑陋。唯一干净的选择是带有渲染器的自定义组件。 但这违反了更基本的不重复规则。以上是关于如何有条件地将某些内容封装在 HTML 元素中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ngfor 中向元素添加 id 以及在 ngfor 中条件创建元素
在 React 中条件渲染组件上的 TailwindCSS 动画
如何快速在labview中条件结构中添加大量分支(例如100个不同分支)?(不要用默认分支。。)