我有一个关于 ap:message 标签的奇怪问题。在页面 a 上有一个包含来自我的数据库的数据的数据表,我可以在 ap:dialog 中进行编辑。一旦所有验证成功并且数据库中的更新完成,我刷新数据表并添加一个faces消息信息以显示操作的成功。在前端,我更新了包含 dataTable 和对话框的表单。我的问题是该消息已显示但几乎立即消失。这就像消息标签随着表单更新。我不明白。
我试图将消息标签移入和移出表单中没有任何改变。我试图调整 remoteCommand 以仅更新 dataTable 和对话框,但没有用。
<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>
Run Code Online (Sandbox Code Playgroud)
你的具体问题归结为:
<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>
Run Code Online (Sandbox Code Playgroud)
autoUpdate="true"会自动更新每一个Ajax请求的组件。<p:commandButton>所调用这增加了消息并调用Ajax请求updateForm()远程命令。该消息显示在该 ajax 请求上。<p:remoteCommand>调用另一个AJAX请求。但是这个没有添加任何消息,所以在那个 ajax 请求中没有显示任何内容。实际上,上一个ajax请求中显示的消息被清除了。您可以使用ignoreAutoUpdate命令组件的属性来让它忽略任何可autoUpdate启用的组件。所以你的解决方案是:
<p:remoteCommand name="updateForm" update="@form" ignoreAutoUpdate="true" />
Run Code Online (Sandbox Code Playgroud)
这就是说,你为什么仍然有两个<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |