Sapui5 sap.m.MessageBox.confirm在刷新页面时显示未定义[F5]

Sapui5 sap.m.MessageBox.confirm在刷新页面时显示未定义[F5],sapui5,Sapui5,每当我使用F5刷新页面时,都会出现一个错误: 在调试中,我看到totalRtn有值,所以它转到else-当控件转到sap.m.MessageBox.confirm-我得到一个错误,说Uncaught TypeError:无法读取未定义的属性'confirm' if (totalRtn <= 0) { sap.m.MessageToast.show("Cannot return 0 quantity"); } else

每当我使用F5刷新页面时,都会出现一个错误:

在调试中,我看到totalRtn有值,所以它转到else-当控件转到sap.m.MessageBox.confirm-我得到一个错误,说Uncaught TypeError:无法读取未定义的属性'confirm'

if (totalRtn <= 0) {
                    sap.m.MessageToast.show("Cannot return 0 quantity");
                } else {

                    sap.m.MessageBox.confirm("You are returning total of " + totalRtn + " items from this order", {
                        actions: [sap.m.MessageBox.Action.YES, sap.m.MessageBox.Action.NO],
                        styleClass: "messageBoxError",
                        onClose: function(oAction) {
                            if (oAction === sap.m.MessageBox.Action.YES) {
                                ServiceUtils.createEntry(this, oEntry, sEntity, sURL).done(function(data) {
                                    var jsonModel = new JSONModel(data);
                                    var returnNumber = jsonModel.getProperty("/data/SalesDocument");
                                    sap.m.MessageToast.show("Return " + returnNumber + " is created successfully");
                                    vc.getOwnerComponent().getRouter().navTo("stockrooms", {
                                        "companyId": vc.companyId
                                    }, false);

                                }).fail(function(error) {
                                    sap.m.MessageToast.show("Error in return processing");
                                });
                            } else {
                                sap.m.MessageToast.show("Return not confirmed");
                            }
                        }
                    });

是的,MessageBox是一个静态类,一个sap.ui.requiresap/m/MessageBox;语句必须显式执行才能使用该类。

根据Jorg在评论中提到的内容,最新的最佳实践说明,如果在某些情况下仅使用控件,则只应在需要时加载库。这将改善初始加载性能

在您的示例中,只有当totalRtn大于0时,才需要加载sap.m.MessageBox库。因此,我建议对您提供的代码进行以下修改:

else {
sap.ui.require(["sap/m/MessageBox"], function(oMessageBox) {
    oMessageBox.confirm("You are returning total of " + totalRtn + " items from this order", {
        actions: [sap.m.MessageBox.Action.YES, sap.m.MessageBox.Action.NO],
        styleClass: "messageBoxError",
        onClose: function(oAction) {
            if (oAction === sap.m.MessageBox.Action.YES) {
                ServiceUtils.createEntry(this, oEntry, sEntity, sURL).done(
                    function(data) {
                        var jsonModel = new JSONModel(data);
                        var returnNumber = jsonModel.getProperty("/data/SalesDocument");

                        sap.m.MessageToast.show("Return " + returnNumber + " is created successfully");

                        vc.getOwnerComponent().getRouter()
                        .navTo("stockrooms", 
                            { "companyId": vc.companyId }, 
                            false
                        );
                    }).fail(function(error) {
                            sap.m.MessageToast.show("Error in return processing");
                    });
                } else {
                   sap.m.MessageToast.show("Return not confirmed");
                }
            }
        });
    }.bind(this));
...
您需要加载模块sap.m.MessageBox

试试这个:

jQuery.sap.require("sap.m.MessageBox");

if (totalRtn <= 0) {
                    sap.m.MessageToast.show("Cannot return 0 quantity");
                } else {

                    sap.m.MessageBox.confirm("You are returning total of " + totalRtn + " items from this order", {
                        actions: [sap.m.MessageBox.Action.YES, sap.m.MessageBox.Action.NO],
                        styleClass: "messageBoxError",
                        onClose: function(oAction) {
                            if (oAction === sap.m.MessageBox.Action.YES) {
                                ServiceUtils.createEntry(this, oEntry, sEntity, sURL).done(function(data) {
                                    var jsonModel = new JSONModel(data);
                                    var returnNumber = jsonModel.getProperty("/data/SalesDocument");
                                    sap.m.MessageToast.show("Return " + returnNumber + " is created successfully");
                                    vc.getOwnerComponent().getRouter().navTo("stockrooms", {
                                        "companyId": vc.companyId
                                    }, false);

                                }).fail(function(error) {
                                    sap.m.MessageToast.show("Error in return processing");
                                });
                            } else {
                                sap.m.MessageToast.show("Return not confirmed");
                            }
                        }
                    });

问候

sap.m库是否已在代码中加载?我建议将sap.m.MessageBox添加到控制器的sap.ui.define部分,并检查清单以查看哪些库正在预加载。@Jorg如果您可以添加建议作为答案,这样我就可以接受了。