我目前正在开发一个CRUD表单,现在正在研究最简单的部分 - 删除。但是我希望在用户可以进行实际删除之前显示一个对话框。这就是我在使用Primefaces 3.4时遇到问题的地方。出于某种原因,我无法在p:对话框内的按钮中设置操作,ajax = false失败。所以这就是我所做的:
<p:column headerText="#{msgs['action.delete']}"
styleClass="a-center">
<p:commandButton icon="ui-icon-trash"
oncomplete="confirmation.show()">
<f:setPropertyActionListener
target="#{marketingCodeBean.marketingCode}" value="#{code}"></f:setPropertyActionListener>
</p:commandButton>
</p:column>
对话:
<p:confirmDialog id="confirmDialog"
message="#{msgs['message.marketingCode.confirmDelete']}"
header="#{msgs['common.confirmDelete']}" severity="alert"
widgetVar="confirmation">
<p:commandButton id="confirm" value="#{msgs['common.yes']}"
oncomplete="confirmation.hide()" update=":form:mktgCodeTable"
actionListener="#{marketingCodeBean.remove}" />
<p:commandButton id="decline" value="#{msgs['common.no']}"
onclick="confirmation.hide()" type="button" />
</p:confirmDialog>
我知道actionListener不应该用于业务操作,但考虑到数据表和对话框,我无法想到解决方法。关于如何在p:confirmDialog中的p:commandButton中创建ajax = false的任何想法?
答案 0 :(得分:1)
一旦呈现,对话框的HTML输出就会被一些onload JavaScript重新定位到HTML <body>
的末尾,以实现最佳的跨浏览器兼容的叠加/定位。但是,这意味着如果将它放在<form>
内,它将不再在<form>
中,并且同步(非ajax)请求将不再起作用。这不是action
vs actionListener
问题。
<p:dialog>
(以及您似乎实际使用的<p:confirmDialog>
)应该有自己的<h:form>
组件。
<h:form>
<p:dataTable>
...
</p:dataTable>
</h:form>
...
<p:confirmDialog>
<h:form>
...
</h:form>
</p:confirmDialog>