我想知道是否有一种很好的方法来装饰组件与复合组件?
的例子:
<composite:implementation>
<div style="someFancyClass">
<h:inputText value="#{cc.attrs.value}" />
</div>
</composite:implementation>
在本例中,value属性传递给包含的<h:inputText>
。但是其他属性呢?我必须在<composite:interface>
部分声明它们吗?
这将是很好的从标准组件的某种继承,例如,<h:inputText>
的maxlength属性在复合组件自动可用。
我必须在
<composite:interface>
部分声明所有这些吗?
不需要,您可以直接使用maxlength="#{cc.attrs.maxlength}"
而不需要将其声明为<composite:attribute>
。然而,这对于文档目的来说是不好的。开发人员不会看到这个属性出现在复合组件的文档中(例如,它可能被IDE自动完成所使用)。
如果能从标准组件中继承一些属性就好了,例如,
<h:inputText>
的maxlength属性在复合组件中自动可用。
那不可能。为此,您确实需要创建一个完整的自定义UIInput
组件和/或Renderer
(在您的特殊情况下,仅渲染器应该足够)。
我在这里提供了一个如何装饰复合组件的示例https://stackoverflow.com/a/8881510/1151983
但是,这并没有提供真正的继承,而是一种在一组相似的组合组件之间共享公共内容的方法。