2016-01-18 4 views
0

Я использую primefaces 3.5, и я хочу обновить значение объекта, используя p: commandButton с ajax, но когда я нажимаю на p: commandButton, форма полностью отправляется как не-ajax submit. Я попытался с немедленным = true, ajax = "true" (но я читал, что этот параметр является значением по умолчанию) partial-submit = "true", но ничего, кнопка обновляет всю страницу, а не только компонент asignarUA.primefaces commandbutton ajax submit работает как не-ajax submit

Примечание: это портлет с лифтом (6.2 CE).

Это часть кода:

<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui"> 
<h:head></h:head> 
<h:body> 
<h:form> 
    <p:commandButton onclick="asignarUADlg.show()" update=":asignarUA" title="Asignar" value="Asignar"> 
    <f:setPropertyActionListener value="#{solicitud }" target="#{mailboxView.solicitud}"/> 
    </p:commandButton>             
</h:form> 


<p:dialog id="asignarUA" widgetVar="asignarUADlg" modal="true" header="Asignar Unidades Administrativas" width="530" showEffect="fade" hideEffect="fade"> 
    <h:form enctype="multipart/form-data"> 
     <h:outputLabel for="dependencia" value="Dependencia: " /> 
     <h:outputText value="#{mailboxView.solicitud.nombreDependencia}" rendered="#{not empty mailboxView.solicitud}" /> 
     <p:separator /> 

     <p:commandButton value="Enviar" ajax="false" actionListener="#{mailboxView.asignar}" update=":messages2"/> 
     <p:commandButton value="Cancelar" onclick="asignarUADlg.hide()" type="button"/> 
    </h:form> 
</p:dialog> 
</h:body> 
</html> 
+0

Что представляет из себя кнопка? Обратите внимание, что все три не являются ajax. по умолчанию не является ajax true, поэтому, если вам нужно поведение ajax, вы должны вручную установить ajax = true на нужную кнопку. – Bonifacio

+2

В соответствии с примером отображения стилей ajax = true является значением по умолчанию. http://www.primefaces.org/showcase/ui/button/commandButton.xhtml В любом случае я также пробовал с ajax = true, но поведение такое же. Приветствую. –

+1

Ваш код имеет ошибку в строке 5: '' должен быть '' – stiemannkj1

ответ

-1

Мне пришлось обновить версию PrimeFaces до 5.3, и она работает. Единственное, что мне пришлось изменить, это атрибут процесса:

<p:commandButton process="@this :dialogContent" update=":dialogContent" onclick="PF('asignarUADlg').show()" title="Asignar" value="Asignar"> 
    <f:setPropertyActionListener value="#{solicitud }" target="#{mailboxView.solicitud}"/> 
</p:commandButton> 
+0

Я предпочел бы использовать 'oncomplete', чтобы убедиться, что диалог показан после обновления ajax. – djmj

2

Ваш первый p:commandButton показывает диалоговое окно, а затем сразу же пряча его снова. Это также приводит к тому, что страница мигает, и я думаю, что вы ошибаетесь, это мигает для не-ajax submit. Когда вы нажимаете на кнопку p:commandButton, вызывается dialog.show() и отображается диалог. Затем выполняется код update=":dialogId" * и отправляет на сервер запрос ajax, чтобы повторно отобразить диалог. Поскольку сервер не знает, что на клиенте был вызван dialog.show(), сервер считает, что диалог все еще должен находиться в состоянии по умолчанию: hidden. Таким образом, возвращаемый частичный ответ сбрасывает диалог в исходное состояние и снова скрывает диалог.

Решение заключается в обновлении содержимого диалогового окна, а не всего диалогового окна. Для вашего конкретного примера, вы должны добавить id на ваш второй h:form и обновления, с вашего Asignar кнопки:

<h:form> 
    <p:commandButton onclick="asignarUADlg.show()" update=":dialogContent" 
    title="Asignar" value="Asignar"> 

<!-- ... --> 

<p:dialog id="asignarUA" widgetVar="asignarUADlg" modal="true" 
    header="Asignar Unidades Administrativas" width="530" showEffect="fade" hideEffect="fade"> 
    <h:form id="dialogContent" enctype="multipart/form-data"> 

<!-- ... --> 

* Атрибут update вызывает p:commandButton, чтобы сделать код для отправки AJAX запроса в его onclick атрибут. Таким образом, код ajax буквально вызывается сразу после dialog.show().

+0

Привет, спасибо за ваш ответ, я просто попробую, и поведение будет таким же. Но я понял, что это еще не так, но это не мигание, что он делает после показа диалогового окна, поскольку вся страница обновляется, потому что даже URL-адрес меняет его и появляется с большим количеством параметров, таких как прошивка GET. Это очень странно, потому что я пытаюсь использовать тот же код в другом чистом проекте, и он работает. Я не знаю, есть ли что-то с liferay или с моими заголовками. –

+0

Является ли ваш 'p: commandButton'' ajax = "false" '? Вы должны убедиться, что кнопка выполняет запрос ajax. Кроме того, я бы порекомендовал 'diff'-config конфигурации ваших двух проектов (рабочий и неудачный), чтобы увидеть, отличается ли какая-либо конфигурация. – stiemannkj1

+0

Нет, не ajax = "false" Я также пробовал сравнение между рабочим и неработающим кодом, но ничего. –