'No Data' 视图首先打开,然后详细信息页面打开,其中包含 Fiori 中的数据

'No Data' view getting opens first and then Detail Page opens with the data in Fiori

我正在开发一个 Master Detail 应用程序,如果服务 URL 没有 return 数据,那么应该打开一个名为 'NoData' 的视图。但实际上首先发生的是 'NoData' 视图打开,然后显示包含数据的详细信息页面。我不知道 'NoData' 页面为什么以及如何首先出现。下面是我的母版页代码:

Controller.js :

        onInit: function () {

        this.router = sap.ui.core.UIComponent.getRouterFor(this);
        this._custTemp = this.getView().byId("listItemTemp").clone();
        this.refreshFlag = true; // Flag to get new data or not for customers


        this.totalModel = sap.ui.getCore().getModel("totalModel");
        this.getView().setModel(this.totalModel, "totalModel");

        this.oDataModel = sap.ui.getCore().getModel("DataModel");
        this.getView().setModel(this.oDataModel, "DataModel");


        this.oInitialLoadFinishedDeferred = jQuery.Deferred();
        var oEventBus = sap.ui.getCore().getEventBus();

        this.getView().byId("listId").attachEvent("updateFinished", function () {
            this.oInitialLoadFinishedDeferred.resolve();
            oEventBus.publish("MasterPage", "InitialLoadFinished", {
                oListItem: this.getView().byId("listId").getItems()[0]
            });
            if (!sap.ui.Device.system.phone) {
                this._getFirstItem();
            }
        }, this);

        this.functionData = [];
    },
waitForInitialListLoading: function (fnToExecute) {
        jQuery.when(this.oInitialLoadFinishedDeferred).then(jQuery.proxy(fnToExecute, this));
    },

    _getFirstItem: function () {
        sap.ui.core.BusyIndicator.show();
        this.waitForInitialListLoading(function () {
            // On the empty hash select the first item
            var list = this.getView().byId("listId");
            var selectedItem = list.getItems()[0];
            if (selectedItem) {
                list.setSelectedItem(selectedItem, true);
                var data = list.getBinding("items").getContexts()[0];
                sap.ui.getCore().getModel("detailModel").setData(data.getObject());

                this.router.navTo('DetailPage', {
                    QueryNo: data.EICNO
                });
                sap.ui.core.BusyIndicator.hide();
            } else {
                this.router.navTo('NoData');
            }
        }, this);
    },

    onBeforeRendering: function () {
        this._fnGetData();
    },

    _fnGetData: function (oEvent) {

        var that = this;
        this.getView().setModel(this.totalModel, "totalModel");

        if (this.refreshFlag === true) {
            sap.ui.core.BusyIndicator.show(0);

            $.ajax({
                url: "/sap/opu/odata/sap/ZHR_V_CARE_SRV/EmpQueryInitSet('10002001')?$expand=QueryLoginToQueryList/QueryToLog",
                method: "GET",
                dataType: "json",
                success: function (data) {
                    that.getView().getModel("totalModel").setData(data.d.QueryLoginToQueryList);

                    that.refreshFlag = false;
                    sap.ui.core.BusyIndicator.hide();
                    that.statusList();

                },
                error: function (err) {
                    sap.ui.core.BusyIndicator.hide();
                    MessageBox.information(err.responseText + "Please try again");
                }
            });

        }

    }

totalModel 是 json 模型吧?您将在应用加载时收到两个 updateFinished 事件。呈现列表控件并完成绑定后(当模型没有数据时)触发第一个,第二个在 $.ajax 调用更新数据到 totalModel.[=15 之后触发=]

我认为您可以通过将 NoData 导航移至 $.ajax 调用的 'success' 和 'error' 回调来解决此问题。这样做可能涵盖其他用例,例如如果您使用 URL 导航参数并且用户将 URL 中的实体 ID 更改为某个随机数,它会导航到您的 NoData 页面。