如何有条件地将某些内容封装在 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')"/>

我想在&lt;td&gt; 元素中或直接有条件地显示它。现在我这样做:

<c:when test="#not horizontal">
    <tr>
        <td>
            <tr....>
        </td>
    </tr>
</c:when>
<c:when test="#horizontal">
    <tr...>
</c:when>

这样我重复同一段代码两次,这显然很糟糕。我能做什么?

恕我直言,为 tr... 调用创建一个新的自定义组件是没有用的 - 调用它会遇到所有相同的问题。

也许,我可以有条件地将一个标签封装在另一个标签中?可以吗?

另一种方式可能是:将 tr... 标记放在某种变量中,并在使用此变量构造时使用相同的标记。也许,有可能?

你知道如何避免这种重复代码的另一种方法吗?

【问题讨论】:

【参考方案1】:

如果您使用的是旧版 JSP,请将其包装在 &lt;f:verbatim&gt; 中。

<f:verbatim rendered="#not horizontal"><tr><td></f:verbatim>
    <tr:selectBooleanRadio ... />
<f:verbatim rendered="#not horizontal"></td></tr></f:verbatim>

如果您使用 JSPX 或 Facelets,这会在上述构造上产生 XML 错误,这在 XML 中是非法的,请将其转义为 &lt;h:outputText escape="false"&gt;

<h:outputText value="&lt;tr&gt;&lt;td&gt;" escape="false" rendered="#not horizontal" />
    <tr:selectBooleanRadio ... />
<h:outputText value="&lt;/td&gt;&lt;/tr&gt;" escape="false" rendered="#not horizontal" />

【讨论】:

最后我需要声明 xmlns:h="java.sun.com/jsf/html"。看起来很脏。第一个变体更令人同情,请问我对这个 f: 有什么要求? 如回答,它在 Facelets 中不起作用。顺便说一句,它只是标准的核心标签,自 JSF 2.0 起才被弃用。 我已经检查过了 它违反了 XML 规则(文档必须格式正确)。因此丑陋。唯一干净的选择是带有渲染器的自定义组件。 但这违反了更基本的不重复规则。

以上是关于如何有条件地将某些内容封装在 HTML 元素中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ngfor 中向元素添加 id 以及在 ngfor 中条件创建元素

在 React 中条件渲染组件上的 TailwindCSS 动画

如何避免 VxWorks 中条件变量中的竞争条件

如何快速在labview中条件结构中添加大量分支(例如100个不同分支)?(不要用默认分支。。)

多线程编程中条件变量和的spurious wakeup 虚假唤醒

React中条件渲染和循环