【问题标题】:Sapui5 ODATA Busy Indicator Dialog don't show [duplicate]Sapui5 ODATA 繁忙指示器对话框不显示 [重复]
【发布时间】:2017-05-30 14:39:28
【问题描述】:

我的代码有问题,当我点击“保存”时,我需要显示一个忙碌的对话框,但它没有显示我不知道为什么,我搜索了 5 天,但没有任何帮助,我尝试使用异步发布、延迟调用和其他方法来完成这项工作。

当我点击“Guardar”按钮时,我需要在与服务器的通信开始时显示一个繁忙的对话框,我所拥有的代码是下一个:

onSaveRaw: function(oEvent) {

        var that = this;
        var ILgort = this.byId("sAlmacen_id").getValue();
        var IWerks = this.byId("sCentro_id").getValue();
        var IFechaoper = this.byId("sDate_id").getValue();
        var RecTemm = this.byId("sTemm_id").getValue();
        var RecTemt = this.byId("sTemt_id").getValue();
        var RecDeno = this.byId("sDeno_id").getValue();
        var RecPorc = this.byId("sPorc_id").getValue();
        var RecPres = this.byId("sPres_id").getValue();
        var RecHume = this.getView().byId("_select0").getSelectedKey();
        var RecAgua = this.getView().byId("_select1").getSelectedKey();

        if (this.validarCampoRequerido(ILgort)) {
            return;
        }
        if (this.validarCampoRequerido(IWerks)) {
            return;
        }
        if (this.validarCampoRequerido(IFechaoper)) {
            return;
        }
        if (this.validarCampoRequerido(RecTemm)) {
            return;
        }
        if (this.validarCampoRequerido(RecTemt)) {
            return;
        }
        if (this.validarCampoRequerido(RecDeno)) {
            return;
        }
        if (this.validarCampoRequerido(RecPorc)) {
            return;
        }
        if (this.validarCampoRequerido(RecPres)) {
            return;
        }
        //Creación del catalogo de datos del formulario.
        var dialog = new sap.m.Dialog({
            title: "Confirmación",
            type: "Message",
            state: "Warning",
            content: new sap.m.Text({
                text: "Se generará el documento de inventario. ¿Desea continuar?"
            }),
            beginButton: new sap.m.Button({
                text: "Guardar",
                press: function() {
                    var oData = {
                        "ILgort": ILgort,
                        "IWerks": IWerks,
                        "IFechainv": IFechaoper,
                        "ICharact010": RecTemm,
                        "ICharact020": RecTemt,
                        "ICharact030": RecDeno,
                        "ICharact040": RecPorc,
                        "ICharact050": RecPres,
                        "ICharact080": RecHume,
                        "ICharact090": RecAgua
                    };
                    //console.log(oData);var _this = this;

                    //Se crea instancia del servicio
                    var oModel = new sap.ui.model.odata.ODataModel("/sap/opu/odata/sap/XXXXXXXXX/");
                    var oGlobalBusyDialog = new sap.m.BusyDialog();
                    oGlobalBusyDialog.open();
                    oModel.create("/LECTURATANQUESet", oData, null, function(oResponse) {
                        sap.m.MessageBox.alert(oResponse.Message, {
                            title: "Exito",
                            textDirection: sap.ui.core.TextDirection.Inherit,
                            onClose: function() {
                                that.onRefresh();
                                that._navBack();
                            }
                        });
                    }, function(oError) {
                        var oNum = oError.response.statusCode;
                        if (oNum == "500") {
                            sap.m.MessageBox.alert("Error, Sesión Finalizada por tiempo de Conexión.", {
                                title: "Error",
                                textDirection: sap.ui.core.TextDirection.Inherit,
                                onClose: function() {}

                            });

                        } else if (oNum == "504") {
                            sap.m.MessageBox.alert("Error de gateway, vuelva a intentar por favor.", {
                                title: "Error",
                                textDirection: sap.ui.core.TextDirection.Inherit,
                                onClose: function() {}

                            });

                        } else {

                            var oMsg = $(oError.response.body).find("message").first().text();
                            sap.m.MessageBox.alert(oMsg, {
                                title: "Error",
                                textDirection: sap.ui.core.TextDirection.Inherit,
                                onClose: function() {}

                            });

                        }

                    });
                    oGlobalBusyDialog.close();
                    dialog.close();
                }
            }),
            endButton: new sap.m.Button({
                text: "Cancelar",
                press: function() {
                    dialog.close();
                }
            }),
            afterClose: function() {

            }
        });
        dialog.open();

    }

如果有人可以给我任何提示,我将非常感激。

【问题讨论】:

  • stackoverflow.com/a/61573982/5846045。主要问题是该应用程序依赖于已弃用的ODataModel,它主要使用同步 XHR,因此冻结了 UI 线程,从而阻止了在请求期间显示对话框。请改用v2.ODataModel

标签: javascript jquery odata sapui5


【解决方案1】:

您使用了错误的 BusyIndi​​cator。试试这个:

sap.ui.define([
    "sap/ui/core/BusyIndicator"
],
function (BusyIndicator) {
    BusyIndicator.show();
    //...
    BusyIndicator.hide();
});

【讨论】:

  • 如果您这样做,指示器将显示并立即隐藏。对hide() 的调用必须发生在异步回调中。
  • @Marc 绝对,这对我来说似乎很明显,这就是为什么我只是简化了使用示例......然后我还要补充一点,当发生任何异步错误时,应该隐藏 BusyIndi​​cator,否则它将锁定整个页面。
  • 好吧,如果你看一下 Sarco 的代码,它就不那么明显了 ;) 他的 hide 不在回调中。
  • @Sarco 好吧,你用的是哪个版本的 sapui5?
  • 1.28.44,那个版本。
【解决方案2】:

您需要在create 函数的成功和错误回调中调用oGlobalBusyDialog.close();。因此,当create 函数完成时(成功或错误),您将关闭忙碌对话框。

此外,您必须删除 press 事件处理程序倒数第二行中的 oGlobalBusyDialog.close();

编辑(重新阅读文档后更新如何使用create

像这样使用create

oModel.create("/LECTURATANQUESet",
    oData, {
        success: successCallback,
        error: errorCallbak
    }
)

【讨论】:

  • 我要试试! :)
  • 另外,根据SAPUI5 docscreate 函数将成功回调作为第 5 个参数,将错误作为第 6 个参数。你能不能也换一下试试?
  • 尝试改变方法?怎么样?
  • 谢谢你的例子,我现在试试,如果可行我会回复你的:)
  • 嗯,不工作,是一样的,它一直冻结,后来不显示成功或错误的消息对话框...:/
【解决方案3】:

我最近也遇到了这个问题。 sap.ui.model.odata.ODataModel 的 Create 函数在(同步)执行时会冻结浏览器并防止显示较慢的繁忙指示器。

我通过激活函数的异步模式解决了(默认是同步执行的):

oModel.create("/LECTURATANQUESet",
oData, {
    success: successCallback,
    error: errorCallbak, 
    async: true
}

https://sapui5.hana.ondemand.com/sdk/#/api/sap.ui.model.odata.ODataModel%23methods/Summary

但是,这样做应该有一些考虑:“请求是否应该异步完成。默认值:false 请注意,此功能官方不支持,因为如果应用程序不确定,使用异步请求可能会导致数据不一致在继续处理数据之前请求已完成。”

只需在此处将解决方案添加给需要 xD 的人!

【讨论】:

  • 你好 jaop!感谢您对 UI5 Q&A 的贡献!正如您已经指出的那样,主要问题是sap.ui.model.odata.ODataModel 默认情况下严重依赖同步 XHR,这就是不推荐使用该模型的原因。请考虑改用sap.ui.model.odata.v2.ODataModel。如果您遇到问题,请告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2015-07-31
  • 2012-09-28
  • 2012-05-28
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多