Действие p:commandbutton не работает внутри диалога p:
У меня есть a p: диалог, и внутри него есть панель. Проблема в том, что метод действия кнопки "Сохранить" не работает. Он даже не вызывает метод. Я могу добраться до метода def. ctrl+lm, поэтому нет проблем с именем метода.
<h:body>
<h:form id="createAppUserForm" prependId="false">
....
<p:dialog id="newRoleDialogId"
header="Add New Role"
resizable="true"
draggable="true"
widgetVar="newRoleDetailsDialog"
appendToBody="true"
>
<p:panel id="newRoleDialogPanel">
<p:panelGrid id="newRoleDialogPanelGrid" columns="2" style="width: 100%" styleClass="panelGridWithoutBorder">
<h:outputText value="Role Name :"/>
<p:inputText value="#{createAppUserController.selectedRole.name}"/>
<h:outputText value="Role Desc :"/>
<p:inputText value="#{createAppUserController.selectedRole.description}"/>
</p:panelGrid>
<center>
<p:commandButton value="Save"
update="roleListDataTable newRoleDialogPanelGrid growlCreateAppUser"
oncomplete="if (!args.validationFailed) newRoleDetailsDialog.hide()"
action="#{createAppUserController.saveNewRole()}"/>
<p:commandButton value="Cancel"
immediate="true"
onclick="newRoleDetailsDialog.hide()" />
</center>
</p:panel>
</p:dialog>
</h:form>
</h:body>
3 ответа
Диалог, когда используется с appendToBody/appendTo="@Body"
должен иметь свою собственную форму.
<p:dialog>
<h:form>
...
</h:form>
</p:dialog>
Потому что, когда диалог генерируется в выводе HTML, он с помощью JavaScript перемещается в конец HTML <body>
что заставляет его больше не сидеть в какой-либо форме. Сгенерированное дерево HTML DOM в конечном итоге выглядит так (используйте инструменты разработчика webbrowser, чтобы увидеть его):
<body>
...
<form id="createAppUserForm">
...
</form>
...
<div id="newRoleDialogId" class="ui-dialog ...">
...
</div>
</body>
appendToBody="true"
играет роль здесь. Конец тела обеспечивает простую и лучшую совместимость между браузерами при отображении модального диалога с помощью JavaScript.
То же самое относится и к p:overlayPanel
с appendTo...
Но также убедитесь, что есть, прежде чем "переместить" p:dialog
нет там вложенного h:form
, Так предотвратить
<h:form>
...
<p:dialog>
<h:form>
...
</h:form>
</p:dialog>
...
</h:form>
Так как, хотя это заканчивается как
<body>
...
<form id="createAppUserForm">
...
</form>
...
<div id="newRoleDialogId" class="ui-dialog ...">
<form>
...
</form>
</div>
</body>
это изначально недействительный HTML
Смотрите также:
Добавление (process="@this") в commandButton сработало для меня.
Попробуйте это p: remoteCommand
http://www.primefaces.org/showcase/ui/ajax/remoteCommand.xhtml
это мой пример
<h:commandButton value="Aceptar" type="button" onclick="irAConf()" class="art-button">
</h:commandButton>
<p:remoteCommand name="irAConf"
action="#{configuracionBean.irAConfiguracion}"/>
The appendToBody="true" играет здесь роль. Этот атрибут был удален из последней версии. Пожалуйста, ищите другую альтернативу