使用JSF 2.1
我们有一个封装搜索结果块的表单。每个块都有一个"Delete"按钮,该按钮与View作用域的后台对话并删除块(从Session作用域bean中)。
看起来像这样:
-- group
-- block (delete button)
-- search result
-- block
-- search result
...
当最后一个块被删除时,整个组消失。
。下面的delete实现可以正常工作:
<h:commandButton
styleClass="delete"
action="#{backing.taBortFranTrafflista(sokning)}"
value="#{backing.getText('trafflista.taBort')}"
onclick="return confirm('#{backing.getText('FR100', sokning.sokbegrepp, backing.aktuelltAntalTraffar(sokning))}');"
rendered="#{backing.javascriptEnabled}"
disabled="#{commons.trafflistaLast}">
<f:ajax render="@form" />
</h:commandButton>
然而,以下在JQuery中使用确认操作的实现工作,但不与最后一个搜索结果一起工作,因此操作(分配给h:commandButton)永远不会被调用:
<ui:fragment rendered="#{backing.javascriptEnabled}">
<div id="dialog#{sokning.hashCode()}" title="Ta bort" class="dialog">
<p>#{backing.getText('FR100', sokning.sokbegrepp, backing.aktuelltAntalTraffar(sokning))}</p>
<h:commandButton
styleClass="delete dialog-button"
action="#{backing.taBortFranTrafflista(sokning)}"
value="#{backing.getText('trafflista.taBort')}"
onclick="closeDialog('dialog#{sokning.hashCode()}')"
disabled="#{commons.trafflistaLast}">
<f:ajax render="@form" onerror="ajaxError"/>
</h:commandButton>
<input
type="submit"
data="dialog#{sokning.hashCode()}"
class="closeDialog dialog-button"
value="#{backing.getText('trafflista.avbryt')}" />
</div>
<ui:fragment rendered="#{not commons.trafflistaLast}">
<input
type="submit"
data="dialog#{sokning.hashCode()}"
class="delete showDialog"
value="#{backing.getText('trafflista.taBort')}" />
</ui:fragment>
<ui:fragment rendered="#{commons.trafflistaLast}">
<input
type="submit"
class="delete showDialog"
value="#{backing.getText('trafflista.taBort')}"
disabled="disabled"/>
</ui:fragment>
</ui:fragment>
faces-redirect=true起作用的原因是表单中的DOM组件与服务器表示相匹配。JQuery对话框呈现在页面底部的表单外部。通过渲染equal @all解决了这个问题。另一个解决方案是在表单中呈现对话框。