Можно ли иметь форму с проверкой и использовать rich: modalPanel для ввода данных? - PullRequest
1 голос
/ 14 февраля 2012

Richfaces 3.3.3, Jsf 1.2:

У меня есть a4j:form, который использует простую проверку, в основном required="true", чтобы гарантировать, что форма не будет отправлена ​​без каких-либо необходимых данных.

У меня также есть некоторые сложные данные для добавления (необязательно) в форму, поэтому я подумал, что лучший способ сделать это - иметь a4j:commandButton, который отображает rich:modalPanel, где пользователь может создать сложный набор данных.

Созданные данные также отображаются в h:selectManyListbox, который перерисовывается при закрытии модальной панели.

Это план, по крайней мере. У меня следующие проблемы:

  • reRender работает, но только если я запрещаю проверку через immediate="true" - что, в свою очередь, препятствует тому, чтобы выбранные данные из modalPanel присутствовали в компоненте поддержки
  • если я удаляю немедленный тег, данные обновляются, но только если нет ошибок проверки

Каков наилучший способ заставить это работать так, как я хочу? Есть ли другой, лучший способ?

UPDATE:

Валидация, которая не проходит, находится в какой-то другой части формы, а не в данных, введенных через modalPanel, которая отображается в списке

КОД:

modalPanel:

<rich:modalPanel id="addTrimming" domElementAttachment="parent" width="150" height="130">
    <f:facet name="header">
        <h:panelGroup>
            <h:outputText value="Define Filter" />
        </h:panelGroup>
    </f:facet>
    <f:facet name="controls">
        <h:panelGroup>
            <h:graphicImage value="/images/close.gif" styleClass="hidelink" id="hidelinkAddTrimming"/>
            <rich:componentControl for="addTrimming" attachTo="hidelinkAddTrimming" operation="hide" event="onclick"/>
        </h:panelGroup>
    </f:facet>

    <h:panelGrid id="trimsettings" columns="3">
        <h:outputText value="Target:" style="font-weight:bold"/>
        <h:inputText id="target" label="XML Filename" required="true" value="#{xmlCreator.trimTarget}">
        </h:inputText>
        <h:outputText value=""/>

        <h:outputText value="Mode:"/>
        <h:selectOneMenu value="#{xmlCreator.trimMode}">
            <f:selectItem itemLabel="Quality" itemValue="quality"/> 
            <f:selectItem itemLabel="after Primer" itemValue="afterPrimer"/> 
            <f:selectItem itemLabel="fixed" itemValue="fixed"/>
            <f:selectItem itemLabel="Median length" itemValue="median"/>
            <f:selectItem itemLabel="Motif" itemValue="motif"/>
        </h:selectOneMenu>
        <h:outputText value=""/>

    </h:panelGrid>

    <h:panelGroup>
        <a4j:commandButton value="OK" action="#{xmlCreator.createTrimming}" onclick="from:submit()">
            <a4j:support event="oncomplete" ajaxSingle="true" immediate="true" reRender="trimsPanel"/>
        </a4j:commandButton>
    </h:panelGroup>
</rich:modalPanel>

соответствующая часть формы:

<h:outputText value="Trimming:"/>
<a4j:outputPanel id="trimsPanel">
    <h:selectManyListbox id="trims" value="#{xmlCreator.selectedTrimmings}">
        <f:selectItems value="#{si:toSelectTrimmingList(xmlCreator.trimmings)}"/>
    </h:selectManyListbox>
</a4j:outputPanel>
<a4j:commandButton id="addTrimButton" immediate="true" value=" + Trimming">
    <rich:componentControl for="addTrimming" attachTo="addTrimButton" operation="show" event="onclick"/>
</a4j:commandButton>

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Если вы делаете это в одной форме, то вы должны разделить ее на две части: одна будет вашей основной формой, а другая будет внутри модальной панели. Таким образом, вы сможете отправить модальную панель независимо от основной формы, и ваша кнопка отправки на модальной панели будет выглядеть следующим образом:

<a4j:commandButton value="OK" action="#{xmlCreator.createTrimming}" reRender="trimsPanel"/>
0 голосов
/ 14 февраля 2012

вы должны использовать процесс с немедленной отправкой данных модалпанели в bean-компонент при закрытии панели с a:commandButton или a:commandLink.для этого данные модальной панели должны быть правильными, как и ожидалось, поэтому вы получите новые действительные данные и добавите их к значению компонента h:selectManyListBox и получите reRender h:selectManyListBox.

это должно работать.если нет, пожалуйста, напишите свой a:form и код modalPanel, чтобы проверить.

...