我想创建复合组件并将一些验证器附加到它的子节点,但我希望验证中的消息附加到复合组件,而不是它的子节点。
在使用复合组件的页面中,我想要这样的东西:
<zzz:mycomponent id="my" />
<h:message for="my" />
现在它不起作用,因为消息是组件的子组件,而不是组件组件本身。如何为整个组件制作它?
或者甚至更好,我想在复合组件中添加验证器,例如:
<zzz:mycomponent id="my" validator="#{bean.validateComposite}" />
接收类似booleans数组的值作为值,因为在复合组件内部有h:selectBooleanCheckbox
个元素。这可能吗?
答案 0 :(得分:1)
回答这个问题可能很晚,但我应该这样做:
<zzz:mycomponent id="my">
<f:event type="postValidate" listener="#{bean.doValidation}"/>
</zzz:mycomponent>
然后在“容器”中验证子项后调用doValidation。方法看起来像这样:
public void doValidation(ComponentSystemEvent event) {
...
}
您在该方法中有两个选项:
访问子组件(event.getComponent()。getChildren())并对您在这些子项上提交的值执行任何操作。
或者遍历FacesMessages并重新分配clientId,以便将它们放在容器组件上(id = my)
答案 1 :(得分:1)
您必须将下一个代码放在复合定义中
<cc:interface>
.....
<cc:editableValueHolder name="attName" targets="Idcomponent" /><!--It allows to acces to the composite-->
<cc:facet name="textMessage"/> <!--Define the Facet-->
</cc:interface>
<cc:implementation id="#{cc.attrs.id}" >
......
<h:inputText id="Idcomponent" value="#{cc.attrs.value}" required="#{cc.attrs.required}"/>
<cc:renderFacet name="textMessage"/>
</cc:implementation>
您可以在JSF页面中使用
<zzz:textBox id="txbTest" label="#{}" value="#{}" >
<f:validateLongRange for="attName" minimum="-10" maximum="10"/>
<f:facet name="textMessage">
<h:message for="value" style="color: blue"/>
</f:facet>
</zzz:textBox>
或另一种选择可能是:
<zzz:textBox id="txbTest" label="#{}" value="#{}" validator="#{bean.yourValidateMethod}" >
<f:facet name="textMessage">
<h:message for="value" style="color: blue"/>
</f:facet>
</zzz:textBox>