【问题标题】:How can I envelope something in HTML element conditionally如何有条件地将某些内容封装在 HTML 元素中
【发布时间】: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... 标记放在某种变量中,并在使用此变量构造时使用相同的标记。也许,有可能?

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

【问题讨论】:

    标签: html jsf jstl trinidad conditional-rendering


    【解决方案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 规则(文档必须格式正确)。因此丑陋。唯一干净的选择是带有渲染器的自定义组件。
    • 但这违反了更基本的不重复规则。
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2023-03-12
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多