UI5 - navTo 不会在尚未显示的页面上启动 onInit 事件

UI5 - navTo doesnt launch onInit event on page which wasnt displayed yet

我有一个具有 3 个级别的 UI5 应用程序

  1. /家

着陆页,其中显示了多个项目。在左侧,有一个导航面板,其中包含所有项目列表的 link。导航面板由具有 属性 itemSelect=onItemSelect<tnt:NavigationList> 控件完成。这个 onItemSelect 函数看起来像这样

        onItemSelect: function (oEvent) {
            const item = oEvent.getParameter('item');
            this.getRouter().navTo(item.getKey());
        },
  1. /home/items

所有项目的列表。每个项目都可以点击。在这个项目列表的控制器上,有一个 onInit 函数从数据库中加载项目列表

  1. /home/items/{itemId} - 商品详情

问题是项目列表上的 onInit() 并不总是执行。如果我打开着陆页(第 1 级),然后单击侧边导航以显示项目列表(第 2 级),则执行 onInit() 并成功加载所有数据。

不过,我还可以选择打开登陆页面(级别 1),然后点击一些最新的项目直接显示它们的详细信息(级别 3),绕过整个项目列表。然后,如果我单击侧面导航以显示项目列表(级别 2),则 onInit() 不会执行并且列表保持为空。

有人可以向我解释为什么会发生这种情况以及如何解决吗?

我明白onInit()只执行了一次,但我不明白为什么它没有在第一个显示的页面上执行时间.

jorgs 建议的编码示例:

导航:

onPress: function (oEvent) {
        var oItem = oEvent.getSource();
        var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
        oRouter.navTo("detail", {
            invoicePath: oItem.getBindingContext("invoice").getPath().substr(1)
        });
    }

控制器中的onInit:

    sap.ui.define([
"sap/ui/core/mvc/Controller"], function (Controller) {
"use strict";
return Controller.extend("sap.ui.demo.wt.controller.Detail", {
    onInit: function () {
        var oRouter = sap.ui.core.UIComponent.getRouterFor(this);
        oRouter.getRoute("detail").attachPatternMatched(this._onObjectMatched, this);
    },
    _onObjectMatched: function (oEvent) {
        this.getView().bindElement({
            path: "/" + oEvent.getParameter("arguments").invoicePath,
            model: "invoice"
        });
    }
});

});

--> 来源:https://help.sap.com/doc/saphelp_uiaddon20/2.05/en-US/23/66345a94f64ec1a80f9d9ce50a59ef/content.htm?no_cache=true

好的,问题解决了。正如我所说,问题是 onInit 甚至没有执行。这是由我犯的一个错误引起的,当我复制粘贴代码时忘记更改初始行 - 所以项目列表和项目详细信息在开始时都扩展了同一个控制器,忘记重写项目详细信息的代码。

`return BaseController.extend('xxx.portal.controller.item.itemList', {

因此,如果项目详细信息在项目列表之前显示,他们还会调用项目列表的控制器,并且在显示实际项目列表时不会调用它