p:commandbutton action在p:dialog中不起作用

时间:2013-09-23 12:01:03

标签: jsf primefaces dialog commandbutton

我有一个p:对话框,里面有一个面板。问题是“保存”按钮的操作方法不起作用。它甚至不调用该方法。我可以达到方法def。使用ctrl + lm,方法名称没有问题。

<h:body>
    <h:form id="createAppUserForm" prependId="false">
      ....
      <p:dialog id="newRoleDialogId"
                  header="Add New Role"
                  resizable="true"
                  draggable="true"
                  widgetVar="newRoleDetailsDialog"  
                  appendToBody="true"
                  >
            <p:panel id="newRoleDialogPanel">
                <p:panelGrid id="newRoleDialogPanelGrid" columns="2" style="width: 100%" styleClass="panelGridWithoutBorder">
                    <h:outputText value="Role Name :"/>
                    <p:inputText value="#{createAppUserController.selectedRole.name}"/>
                    <h:outputText value="Role Desc :"/>
                    <p:inputText value="#{createAppUserController.selectedRole.description}"/>
                </p:panelGrid>
                <center>
                    <p:commandButton value="Save"
                                     update="roleListDataTable newRoleDialogPanelGrid growlCreateAppUser"
                                     oncomplete="if (!args.validationFailed) newRoleDetailsDialog.hide()"                                     
                                     action="#{createAppUserController.saveNewRole()}"/>
                    <p:commandButton value="Cancel"                                         
                                     immediate="true"
                                     onclick="newRoleDetailsDialog.hide()" />
                </center>
            </p:panel>
        </p:dialog>
       </h:form>
    </h:body>

4 个答案:

答案 0 :(得分:13)

当与appendToBody/appendTo="@Body" 一起使用时,该对话框必须具有自己的表单。

<p:dialog>
    <h:form>
        ...
    </h:form>
</p:dialog>

因为,当对话框生成HTML输出时,它被JavaScript重新定位到HTML <body>的末尾,导致它不再以任何形式出现。生成的HTML DOM树最终看起来像这样(使用webbrowser的开发工具来查看它):

<body>
    ...
    <form id="createAppUserForm">
        ...
    </form>
    ...
    <div id="newRoleDialogId" class="ui-dialog ...">
        ...
    </div>
</body>

appendToBody="true"在这里发挥作用。身体的末端确保了通过JavaScript显示模态对话框的简单和最佳的跨浏览器兼容性。

具有p:overlayPanel

appendTo...的方式也是如此

但是也要确保在“移动”p:dialog之前,没有嵌套的h:form。所以阻止

<h:form>
   ...

    <p:dialog>
        <h:form>
            ...
        </h:form>
    </p:dialog>

   ...
</h:form>

因为它最终会像

一样
 <body>
    ...
    <form id="createAppUserForm">
        ...
    </form>
    ...
    <div id="newRoleDialogId" class="ui-dialog ...">
        <form>
           ...
        </form>
    </div>
</body>

它最初是无效的html

另见:

答案 1 :(得分:2)

试试这个p:remoteCommand

http://www.primefaces.org/showcase/ui/ajax/remoteCommand.xhtml

这是我的例子

<h:commandButton value="Aceptar" type="button" onclick="irAConf()" class="art-button">
</h:commandButton>

<p:remoteCommand name="irAConf"
action="#{configuracionBean.irAConfiguracion}"/>                

答案 2 :(得分:0)

appendToBody =“true”在这里发挥作用。此属性已从最新版本中删除。请寻找其他替代方案

答案 3 :(得分:0)

将(process =“ @ this”)添加到commandButton对我有用。