【问题标题】:Decorating standard components in composite components, how to inherit attributes?在复合组件中装饰标准组件,如何继承属性?
【发布时间】:2011-09-15 16:17:45
【问题描述】:

我想知道是否有一种用复合组件装饰组件的好方法?

例子:

<composite:implementation>
    <div style="someFancyClass">
        <h:inputText value="#{cc.attrs.value}" />
    </div>
</composite:implementation>

在这种情况下,值属性被传递给包含的&lt;h:inputText&gt;。但是所有其他属性呢?我必须在&lt;composite:interface&gt; 部分中声明所有这些吗?

从标准组件中继承某种继承会很好,例如&lt;h:inputText&gt; 的 maxlength 属性在复合组件中自动可用。

【问题讨论】:

    标签: jsf jsf-2 facelets composite-component


    【解决方案1】:

    我必须在&lt;composite:interface&gt; 部分中声明所有这些吗?

    没必要,你可以直接使用maxlength="#{cc.attrs.maxlength}",而不需要声明为&lt;composite:attribute&gt;。但是,这对于文档目的是不利的。开发人员不会看到此属性出现在复合组件的文档中(例如,可能由 IDE 自动完成使用)。


    从标准组件中继承某种继承会很好,例如&lt;h:inputText&gt; 的 maxlength 属性在复合组件中自动可用。

    这是不可能的。为此,您确实需要创建一个完全值得自定义的 UIInput 组件和/或 Renderer(在您的特定情况下,只需渲染器就足够了)。

    【讨论】:

    • 谢谢你的回答,你是对的,渲染器在上面显示的简单情况下是合适的。但如果我必须在支持类中执行此操作,我可以将属性映射中的元素复制到嵌套 的属性中,对吗?哪种方法适合呢? decode() 还是组件应该响应 postAddToViewEvent?我只是好奇。
    【解决方案2】:

    我在这里提供了一个关于如何装饰复合组件的示例https://stackoverflow.com/a/8881510/1151983

    但是,这并不提供真正的继承,而是一种在一组相似的复合组件之间共享公共内容的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2020-06-30
      • 2018-11-06
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多