【发布时间】:2014-03-23 03:11:36
【问题描述】:
我想为我想传递一些属性的自定义组件创建验证器。这就是代码的样子(它不是原始代码,但以相同的方式实现):
自定义组件(customComponent.xhtml)
<h:body>
<composite:interface componentType="compositeComponent">
<composite:attribute name="name" required="true" />
<composite:attribute name="value" required="true" />
<composite:attribute name="values" required="true" />
<composite:editableValueHolder name="validator" targets="#{cc.attrs.id}"/>
</composite:interface>
<composite:implementation>
<h:selectOneMenu value="#{cc.attrs.value}" id="#{cc.attrs.id}">
<f:selectItems value="#{cc.attrs.values}" var="item" itemValue="#{item.value}" itemLabel="#{item.label}" />
<composite:insertChildren/>
</h:selectOneMenu>
</composite:implementation>
</h:body>
如您所见,我想将验证器传递给h:selectOneMenu。组件可以(更准确地说是“应该”,因为它目前不起作用)以这种方式使用:
<ns:customComponent name="myComp" value="#{controller.value}" values="#{controller.values}">
<f:validator validatorId="myValidator" for="validator">
<f:attribute name="param1" value="param1Value"/>
<f:attribute name="param1" value="param1Value"/>
</validator>
</ns:customComponent>
我测试了这段代码,如果我不向其中传递属性,就会调用验证器。
<ns:customComponent name="myComp" value="#{controller.value}" values="#{controller.values}">
<f:validator validatorId="myValidator" for="validator"/>
</ns:customComponent>
我发现属性可以这样传递:
<ns:customComponent name="myComp" value="#{controller.value}" values="#{controller.values}">
<f:validator validatorId="myValidator" for="validator"/>
<f:attribute name="param1" value="param1Value"/>
<f:attribute name="param1" value="param1Value"/>
</ns:customComponent>
但是(据我所知)只有验证器会被注入自定义组件(这就是为什么在验证器上设置for="validator")所以我将无法获得这些属性。如何将属性传递给此验证器?
顺便说一句。如果可能的话,我希望将参数作为嵌套元素传递,因为它看起来更清晰。这个:
<f:selectOneMenu>
<f:validator validatorId="myValidator">
<f:attribute name="param1" value="value1"/>
</f:validator>
</f:selectOneMenu>
而不是这个:
<f:selectOneMenu>
<f:validator validatorId="myValidator"/>
<f:attribute name="param1" value="value1"/>
</f:selectOneMenu>
【问题讨论】: