将Omnifaces validateAllOrNone组件用于ui:repeat

时间:2017-04-24 17:03:45

标签: primefaces jsf-2.2 omnifaces

我有以下问题:

我尝试将 o:validateAllOrNone 组件用于ui:repeat并且它工作得很好。但它不适用于我的复合组件。

我的复合组件非常简单 p:inputText ,以获得舒适的输入电话号码。在那里,我使用了javascript,提供不同的电话号码(inputPhoneNumber)。

<p:inputText id="#{cc.attrs.id}" type="tel" label="Номер телефона" value="#{cc.attrs.value}" required="#{cc.attrs.required}"
             styleClass="#{cc.attrs.styleClass} m-pad-left50" style="#{cc.attrs.style}">
</p:inputText>

<script>
    $("#{cc.fullId}").intlTelInput(
        {
            utilsScript: "intl-tel-input/js/utils.js",
            autoHideDialCode: false,
            nationalMode: false,
            preferredCountries: [#{cc.preferredCountries}],
            onlyCountries: [#{cc.countries}],
            dropdownContainer: 'body'
        }
    );
</script>

此外,我还有表单来创建联系人,如电话号码,电子邮件,Skype和等。表单允许创建联系人列表。如果联系人的类别是电话号码,那么我使用了我的复合组件,而不是简单的输入文本:

<ui:repeat value="#{bean.contacts}" var="contact">
    <p:selectOneMenu id="contact_type" value="#{contact.type}">
       ...
    </p:selectOneMenu>

    <p:outputPanel rendered="#{contact.category.equals(category.PHONE)}">
        <mycomponent:inputPhoneNumber id="contact_phone_value" value="#{contact.value}" preferred="ru">
        <o:validateAllOrNone components="contact_type contact_phone_value"/>
    </p:outputPanel>

    <p:outputPanel rendered="#{ne contact.category.equals(category.PHONE)}">
        <p:inputText id="contact_other_value" value="#{contact.value}"/>
        <o:validateAllOrNone components="contact_type contact_other_value"/>
    </p:outputPanel>
</ui:repeat>

我使用 o:validateAllOrNone 来检查联系人类型及其值是否为空。它适用于 p:inputText ,但当我尝试将此组件用于 mycomponent:inputPhoneNumber 时,我抓到了以下例外:

  

异常消息:ValidateAllOrNone属性'components'必须引用   现有客户ID。无法找到客户ID“contact_type”。

我找到问题the question,我知道如何充分利用 ui:repeat 。之后我改写了我的代码:

<ui:repeat id="contact_list" value="#{bean.contacts}" var="contact" varStatus="status">
    <p:selectOneMenu id="contact_type" value="#{contact.type}">
       ...
    </p:selectOneMenu>

    <p:outputPanel rendered="#{contact.category.equals(category.PHONE)}">
        <mycomponent:inputPhoneNumber id="contact_phone_value" value="#{contact.value}" preferred="ru">
        <o:validateAllOrNone components="contact_creation_form-contact_list-#{status.index}-contact_type contact_phone_value"/>
    </p:outputPanel>

    <p:outputPanel rendered="#{ne contact.category.equals(category.PHONE)}">
        <p:inputText id="contact_other_value" value="#{contact.value}"/>
        <o:validateAllOrNone components="contact_type contact_other_value"/>
    </p:outputPanel>
</ui:repeat>

现在我已经为联系人类型添加了正确的ID,但是我遇到了同样的例外:

  

异常消息:ValidateAllOrNone属性'components'必须引用   现有客户ID。客户ID   找不到'contact_creation_form-list-2-contact_type'。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我应该从另一边走。很容易获得复合组件的完整ID,并在 o:validateAllOrNone 中使用它。它解决了这个问题。在这种情况下,复合组件的正确ID是 contact_phone_value-contact_phone_value 。在该代码看起来像:

<ui:repeat value="#{bean.contacts}" var="contact">
    <p:selectOneMenu id="contact_type" value="#{contact.type}">
       ...
    </p:selectOneMenu>

    <p:outputPanel rendered="#{contact.category.equals(category.PHONE)}">
        <mycomponent:inputPhoneNumber id="contact_phone_value" value="#{contact.value}" preferred="ru">
        <o:validateAllOrNone components="contact_type contact_phone_value-contact_phone_value"/>
    </p:outputPanel>

    <p:outputPanel rendered="#{ne contact.category.equals(category.PHONE)}">
        <p:inputText id="contact_other_value" value="#{contact.value}"/>
        <o:validateAllOrNone components="contact_type contact_other_value"/>
    </p:outputPanel>
</ui:repeat>

另外你应该知道我使用' - '代替':'作为id delimeter。