如果组合组件为空,如何不设置组件内部的属性?

Posted

技术标签:

【中文标题】如果组合组件为空,如何不设置组件内部的属性?【英文标题】:How not to set an attribute of a component inside a composite component if it is empty? 【发布时间】:2016-02-02 04:15:30 【问题描述】:

我在这样的复合组件中有一个 h:graphicImage:

<composite:interface>
    <composite:attribute name="name" required="true" type="java.lang.String" />
    <composite:attribute name="alt" required="false" type="java.lang.String" />
    <composite:attribute name="height" required="false" type="java.lang.String" />
    <composite:attribute name="width" required="false" type="java.lang.String" />
</composite:interface>

<composite:implementation>

    <h:graphicImage url="something-common#cc.attrs.name"
                
                
                 />

</composite:implementation>

但是,如果某些属性未设置(例如宽度、高度),则它们会被渲染为空。在win7上的IE9中,这会导致img标签的宽度和高度属性被渲染为1。所以图像有1px的宽度和1px的高度。

【问题讨论】:

【参考方案1】:

您可以通过&lt;c:if&gt;&lt;f:attribute&gt;有条件地添加属性。

<h:graphicImage ...>
    <c:if test="#not empty cc.attrs.height"><f:attribute name="height" value="#cc.attrs.height" /></c:if>
    <c:if test="#not empty cc.attrs.width"><f:attribute name="width" value="#cc.attrs.width" /></c:if>
</h:graphicImage>

另见:

JSTL in JSF2 Facelets... makes sense?

【讨论】:

非常感谢。但是,如果例如在支持 bean 中计算宽度属性并且组件根据 ajax 请求重新呈现/更新,这可能不起作用,对吗? 它确实只有在视图被隐式/显式重建时才有效。这取决于你的具体情况。只需尝试看看它是否适用于您的特定情况。另一种方法是覆盖和自定义渲染器。

以上是关于如果组合组件为空,如何不设置组件内部的属性?的主要内容,如果未能解决你的问题,请参考以下文章

Vue2将对象作为道具发送到组件为空或具有属性

EUI库 - 10 - 使用自定义组件

Spring启动 - 会话作用域组件的setter不能使用单件服务 - 字段为空

混合 Blazor 组件、DI 和 C# 8 可为空

在 R/Shiny 中将输出组件设置为空

Angular 2 组件显示问题高度宽度为空