у меня странная проблема с тегом p:message. На странице есть таблица данных с данными из моей базы данных, которую я могу редактировать в диалоговом окне p:. После успешного завершения всех проверок и завершения обновления в базе данных я обновляю таблицу данных и добавляю информацию о сообщениях лиц, чтобы отобразить успех операции. В интерфейсе я обновляю форму, которая содержит как таблицу данных, так и диалог. Моя проблема в том, что сообщение отображается, но почти мгновенно исчезает. Как будто тег сообщения обновляется вместе с формой. Я не понимаю.
Я попытался переместить тег сообщения в форму и из нее, ничего не изменилось. Я попытался настроить remoteCommand, чтобы обновить только таблицу данных и диалоговое окно, но это не сработало.
<p:messages autoUpdate = "true" showDetail = "true" severity = "info,error" />
<h:form id = "form">
<p:dataTable
style = "width: 80%; margin-left: auto; margin-right: auto; text-align:center"
var = "achievement" value = "#{achievementBean.listAchievement}">
...
</p:dataTable>
<p:dialog header = "#{i18n['achievement']}" widgetVar = "dlg"
dynamic = "true" closable = "false" resizable = "false" showEffect = "fade"
hideEffect = "fade">
<h:panelGroup id = "achievementDetail">
<p:messages autoUpdate = "true" severity = "warn" />
...
<h:panelGrid columns = "2" style = "width: 100%; text-align:center">
<p:commandButton value = "#{i18n['general.submit']}"
icon = "fa fa-check"
actionListener = "#{achievementBean.submitAchievement}"
oncomplete = "if (!args.validationFailed){updateForm();}" />
<p:commandButton value = "#{i18n['general.cancel']}"
icon = "fa fa-close" action = "#{achievementBean.submitCancel}"
oncomplete = "PF('dlg').hide();" update = "@form" process = "@this" />
</h:panelGrid>
<p:remoteCommand name = "updateForm" update = "@form" />
</h:panelGroup>
</p:dialog>
</h:form>
Поскольку OP узнает, создавая минимальный воспроизводимый пример, удаляя все больше и больше из своего кода, и в emd, замечая удаление того, что вы упомянули, это заставляет его работать. Опять минимальный воспроизводимый пример на помощь
Спасибо за ваши ответы. Извините за mre, я всегда забываю об этом. В следующий раз постараюсь не забыть. Наконец-то мне удалось решить мою проблему.
<p:message>
<p:commandButton>
Ваша конкретная проблема сводится к следующему:
<p:messages autoUpdate = "true" />
<h:form>
<p:dataTable ...>
...
</p:dataTable>
...
<p:dialog>
...
<p:commandButton
action = "#{achievementBean.submitAchievement}"
oncomplete = "if (!args.validationFailed){updateForm();}" />
<p:remoteCommand name = "updateForm" update = "@form" />
</p:dialog>
</h:form>
autoUpdate = "true"
будет автоматически обновлять компонент при каждом запросе ajax.<p:commandButton>
вызывает запрос ajax, который добавляет сообщение и вызывает удаленную команду updateForm()
. Сообщение отображается в этом запросе ajax.<p:remoteCommand>
вызывает другой запрос ajax. Но этот не добавляет никаких сообщений, поэтому в этом запросе ajax ничего не отображается. В результате сообщение, отображаемое в предыдущем запросе ajax, удаляется.Вы можете использовать атрибут ignoreAutoUpdate
компонента команды, чтобы он мог игнорировать любой компонент с возможностью autoUpdate
. Итак, ваше решение:
<p:remoteCommand name = "updateForm" update = "@form" ignoreAutoUpdate = "true" />
Тем не менее, почему у вас все еще есть и <p:dialog>
, и <p:dataTable>
в одном и том же <h:form>
? Похоже, вы не приняли или не поняли рекомендацию, содержащуюся в моем ответе на ваш предыдущий вопрос p:commandButton не отображает p:dialog. В нем я рекомендовал вынести <p:dialog>
за пределы <h:form>
и дать ему собственное <h:form>
. Это значительно упрощает управление этими вещами.
Вы должны всегда дать <p:dialog>
свой собственный <h:form>
.
<p:messages autoUpdate = "true" />
<h:form>
<p:dataTable ...>
...
</p:dataTable>
<p:remoteCommand name = "updateForm" update = "@form" ignoreAutoUpdate = "true" />
</h:form>
<p:dialog widgetVar = "dlg">
<h:form>
...
<p:commandButton
action = "#{achievementBean.submitAchievement}"
update = "@form"
oncomplete = "if (!args.validationFailed){PF('dlg').hide();updateForm();}" />
</h:form>
</p:dialog>
Спасибо за ваш ответ, я лучше понимаю, почему это не сработало. Чтобы ответить на ваш вопрос о единой форме, это потому, что этот код старше, чем вопрос, который я задал. Не забыл вашу рекомендацию по поводу формы и диалогов ;-).
Я почти уверен, что это потому, что у вас есть автоматическое обновление = «истина» в ваших сообщениях. Если вы посмотрите сетевой трафик с помощью F12, вы его увидите.