Несколько отправок со страницы включаются динамически с использованием простых лиц ajax - PullRequest
1 голос
/ 23 декабря 2011

Я боролся с этим некоторое время, надеюсь, кто-нибудь сможет мне помочь.

У меня есть этот код, работающий с использованием JSF-2 (взят из решения, предоставленного BalusC в этот вопрос ):

<h:panelGroup id="content" layout="block">
    <h:form id="contentform">
        <h:panelGroup rendered="#{bean.page == 'include1'}">
            <ui:include src="include1.xhtml" />
        </h:panelGroup>
        <h:panelGroup rendered="#{bean.page == 'include2'}">
            <ui:include src="include2.xhtml" />
        </h:panelGroup>
        <h:panelGroup rendered="#{bean.page == 'include3'}">
            <ui:include src="include3.xhtml" />
        </h:panelGroup>
    </h:form>
</h:panelGroup>  

Затем, внутри каждой включенной страницы, у меня есть что-то вроде этого (также работает):

<h:outputText value="Name: "/>
<h:inputText value="#{itemsBean.item.name}" id="name" required="#{not empty param[save.clientId]}"/>                    

<h:outputText value="Desc: "/>
<h:inputText value="#{itemsBean.item.description}" id="desc" required="#{not empty param[save.clientId]}"/>

<h:commandButton binding="#{save}" label="Save" actionListener="#{itemsBean.save}">
    <f:ajax render=":contentForm" execute="name desc"
</h:commandButton>

<h:dataTable value="#{itemsBean.itemsList}" var="item">
    <h:column>
        <h:outputText value="#{item.name}" />
    </h:column>
    <h:column>
        <h:outputText value="#{item.description}" />
    </h:column>
</h:dataTable>  

Теперь проблема .
Он начинается, когда я пытаюсь использовать PrimeFaces для включенных страниц, особенно когда я заменяю <h:commandButton... на:

<p:commandButton binding="#{save}" value="Save" actionListener="#{itemsBean.save}">
    <p:ajax update=":contentForm" process="name desc" />
</p:commandButton>  

В результате форма отправляется несколько раз, и даже поля ввода с других включенных (не отображаемых) страниц обрабатываются (общий беспорядок).

Я использую:
JSF 2.1.1 Реализация мохарры.
PrimeFaces 3.0-RC2.
Tomcat 7.
(Tomcat и JSF входят в состав NetBeans 7.0.1)

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 23 декабря 2011

На p:commandButton почему вы используете оба атрибута binding и actionListener?Что такое #{save} кстати?Вы имеете в виду #{itemsBeans.save}?

Независимо от того, если вы устанавливаете actionListener в методе сохранения вашего управляемого компонента, вам также не следует связывать его.Удалите атрибут привязки и посмотрите, предотвращает ли это множественные обратные передачи.

0 голосов
/ 29 декабря 2011

По умолчанию простые символы включены в Ajax.Поэтому вам не нужно указывать

<p:commandButton value="Save" 
  update="@form"  
  process="@this,name,desc"
     actionListener="#{itemBean.save}" /> 

2) "@ this" является обязательным.Он должен обрабатывать команду click кнопки.3) используйте prependId = "false" в.Это позволит вам указывать имена элементов управления в атрибуте процесса в качестве фактических имен элементов управления, т. Е. Name, desc, в противном случае вам придется указывать имя формы перед элементами управления, например contentFrom: name, contentForm: desc

Update= @form означает, что он выполнит полную форму после выполнения.

Надеюсь, что это решит проблему.

0 голосов
/ 24 декабря 2011

Мне пришлось заменить binding="#{save}" на что-то вроде binding="#{savePage1}", binding="#{savePage2}" и binding="#{savePage2}" на каждой соответствующей странице.

Еще одна ошибка была в <p:ajax..., которая вызывала странное поведение. У меня было это:

<p:ajax update=":contentForm" process="name desc" />

и должно быть так:

<p:ajax update=":contentForm" process="@this name desc" />

Похоже, что "@this" не является обязательным в <f:ajax execute="..

...