5

我有一个这样的 jsf facelet 页面(非常简化的版本):

    <h:form id="frmAnagPersonName">
        <p:commandButton value="Edit" icon="ui-icon-gear" 
                         update="@form :frmEdit"
                         onsuccess="_dlgEdit.show()"/>
        ...
        <p:dataTable etc...
        ...


    </h:form>

    <p:dialog id="dlgEdit" widgetVar="_dlgEdit" dynamic="true" modal="true" closable="true"
              header="Person Identity">  
        <h:form id="frmEdit" >
            <p:panelGrid id="pnlEdit" columns="2">
                <p:outputLabel id="lblName" for="eName" value="Name"/>
                <p:inputText id="eName" value="#myBean.personName}"
            </p:panelGrid>
        </h:form>
    </p:dialog>  

它工作正常,直到我在对话框中放置一个动态标题:

<p:dialog ... header="#{myBean.header}" ...  >  

此时我必须更改以下update属性p:commandButton

update="@form :dlgEdit"  

但在这种情况下,对话框只会在第一次单击按钮时出现。它不会出现第二次,然后再次出现......
为什么?如何让对话框始终显示?

谢谢

4

1 回答 1

11

使用oncomplete属性而不是onsuccess属性。

<p:commandButton ... update="@form :dlgEdit" oncomplete="_dlgEdit.show()" />

onsuccess当 ajax 响应成功到达但在基于 ajax 响应执行 ajax 更新很久之前直接调用该属性。当 ajax 更新成功完成时调用该oncomplete属性。另请参阅的标签文档<p:commandButton>

基本上,这是事件调用顺序:

  • onclick处理程序被调用
  • ajax 请求是根据表单数据准备的process
  • onbegin处理程序被调用
  • 发送ajax请求
  • 成功获取 ajax 响应(HTTP 状态码为 200)
  • onsuccess处理程序被调用
  • ajax 更新在 HTML DOM 中基于update
  • oncomplete处理程序被调用
于 2013-02-22T17:01:08.320 回答