Ваша конкретная проблема сводится к следующему:
<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>
См. Также: