繁体   English   中英

Primefaces 7 executeScript() 未在 ajax 请求中调用 javascript 函数

[英]Primefaces 7 executeScript() not invoking javascript functions in ajax requests

我有一个带有 primefaces 7 的小项目。它显示了一个包含一些数据的表格,并且在每一行中都有一个按钮打开一个对话框来修改项目。 一切正常,除非我尝试关闭对话框并在修改 bean 的保存方法中重新加载网格。

由于某种原因我无法理解,代码PrimeFaces.current().executeScript("closeModifyDialog(); reloadGrid();"); 根本不起作用,在 eclipse 控制台和浏览器中都没有错误。

我试图把它放在别的地方PrimeFaces.current().executeScript("alert('peek-a-boo')"); 并且只有当我将它放在列表的 bean 的构造函数中时它才有效(这也是打开站点时加载的第一个 bean,非 ajax 请求)

如果你需要别的东西问我,我被这个东西困住了,我错在哪里?

项目列表.xhtml

        <h:form id="itemsListForm">
            <h:panelGroup id="messagesPanel" styleClass="mrm-overflow-messages">
                <p:messages for="#{itemsListBean.infoMessagesBox}" closable="true" />
                <p:messages for="#{itemsListBean.errorMessagesBox}" closable="true" />
            </h:panelGroup>

            <p:remoteCommand name="**reloadGrid**"
                actionListener="#{itemsListBean.onSearch()}"
                update="@form:accordionPanel:itemsDataTable" />
            <p:remoteCommand name="updateMessages" update="@form:messagesPanel" />

            <p:remoteCommand name="**closeModifyDialog**"
                action="PF('modifyItemDialog').hide()" update="modifyItemDialog" />

            <p:accordionPanel id="accordionPanel"
                styleClass="items-list-accordion" multiple="true" activeIndex="0,1">
                <!-- FILTRI -->
                <p:tab title="#{defaultBundle.filters}">
                </p:tab>

                <!-- TABELLA -->
                <p:tab title="#{defaultBundle.assets}">
                    <p:dataTable id="itemsDataTable" value="#{itemsListBean.items}"
                        var="item" rows="10" paginator="true"
                        rowsPerPageTemplate="10, 20, 50, 100" paginatorPosition="bottom"
                        styleClass="items-list-datatable">
                        <p:column style="width: 5%; text-align: center;">
                            <p:commandButton value="Mod"
                                actionListener="#{itemsListBean.modifyItem(item)}"
                                oncomplete="PF('modifyItemDialog').show();" />
                        </p:column>

                         [...]
                    </p:dataTable>
                </p:tab>
            </p:accordionPanel>

            <h:panelGroup id="modifyItemDialogParent">
                <p:dialog id="modifyItemDialog" widgetVar="modifyItemDialog"
                    header="#{defaultBundle.asset}" modal="true" resizable="false"
                    closable="true" draggable="true" position="center"
                    showEffect="fade" onShow="initDialog();" hideEffect="fade">
                    <ui:include src="xhtml-dialogs/modifyItemDialog.xhtml" />
                </p:dialog>

                <p:remoteCommand name="initDialog"
                    actionListener="#{modifyItemBean.init()}"
                    update="@form:modifyItemDialog:modifyItemPanel" />

            </h:panelGroup>

            <p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
                <p:commandButton value="#{defaultBundle.confirm}"
                    style="float: right;" styleClass="ui-confirmdialog-yes" />
                <p:commandButton value="#{defaultBundle.back}" style="float: right;"
                    styleClass="ui-confirmdialog-no" />
            </p:confirmDialog>
        </h:form>

modifyItemDialog.xhtml

     <h:panelGroup id="modifyItemPanel" styleClass="modify-item-panel">

        <h:panelGroup id="dialogMmessagesPanel"
            styleClass="mrm-overflow-messages">
            <p:messages for="#{itemsListBean.infoMessagesBox}" closable="true" />
            <p:messages for="#{itemsListBean.errorMessagesBox}" closable="true" />
        </h:panelGroup>

        <p:panelGrid style="width: 100%">
            <p:row>
                <p:column>
                    <p:inputNumber styleClass="input-big" decimalPlaces="0"
                        thousandSeparator="" decimalSeparator=","
                        value="#{modifyItemBean.oldCode}" />
                </p:column>
                <p:column>
                    <p:commandButton value="#{defaultBundle.save}"
                        actionListener="#{modifyItemBean.save()}"
                        update="dialogMmessagesPanel">
                        <p:confirm header="#{defaultBundle.save}"
                            message="#{defaultBundle.saveItemMessage}" />
                    </p:commandButton>
                </p:column>
                <p:column>
                    <p:inputNumber styleClass="input-big" decimalPlaces="0"
                        thousandSeparator="" decimalSeparator=","
                        value="#{modifyItemBean.newCode}" />
                </p:column>
            </p:row>
        </p:panelGrid>
     </h:panelGroup>

修改ItemBean.java

@ViewScoped
@ManagedBean(name = "modifyItemBean")
public class ModifyItemBean extends BasicBean {

[...]

public void save() {

        if (validateForm()) {

            switch (mode) {
            case MODIFY:
                item.setCodice(oldCode);
                item.setCodiceNuovo(newCode);
                item.setDescrizione(description);
                item.setBene(asset);
                item.setUbicazione(site);
                item.setFabbricato(building);
                item.setPiano(floor);
                item.setValore(value);
                item.setPresente(present);

                SaveItemEnvelopeIN request = new SaveItemEnvelopeIN();
                request.setItem(item);

                Envelope response = itemsService.mergeItem(request);

                if (response.isSuccessfullyCompleted()) {
                    **PrimeFaces.current().executeScript("closeModifyDialog(); reloadGrid();");**
                    addInfoMessage("ITEM_SAVED_SUCCESSFULLY");
                } else {
                    addErrorMessages(response.getErrors());
                }
                break;
            default:
                break;
            }
        }
    }
}

构建一个最小的示例(仍然有问题),我尝试从

com.sun.faces jsf-api 2.0.1
com.sun.faces jsf-impl 2.0.1

org.glassfish jakarta.faces 2.3.14
javax.enterprise cdi-api 2.0.SP1

(感谢 BalusC 评论)

这就是诀窍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM