4

我想创建复合组件并将一些验证器附加到它的子组件,但我希望来自验证的消息附加到复合组件,而不是它的子组件。

在使用复合组件的页面中,我想要这样的东西:

<zzz:mycomponent id="my" />
<h:message for="my" />

现在它不起作用,因为消息是针对组件的子组件,而不是复合组件本身。如何为整个组件制作它?

或者更好的是,我想向复合组件添加验证器,例如:

<zzz:mycomponent id="my" validator="#{bean.validateComposite}" />

并且接收类似布尔数组的东西作为值,因为在复合组件内部有h:selectBooleanCheckbox元素。那可能吗?

4

2 回答 2

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>
于 2011-12-14T21:30:36.107 回答
1

回答这个问题可能很晚,但我应该这样做:

<zzz:mycomponent id="my">
   <f:event type="postValidate" listener="#{bean.doValidation}"/>
</zzz:mycomponent>

然后在“容器”中的子项验证之后调用 doValidation。该方法如下所示:

public void doValidation(ComponentSystemEvent event) {
    ...
}

在该方法中您有 2 个选项:

  • 访问子组件(event.getComponent().getChildren())并对提交给这些子组件的值做任何你想做的事情。

  • 或遍历 FacesMessages 并重新分配 clientId 以便将它们放置在您的容器组件上 (id = my)

于 2011-12-09T13:36:27.173 回答