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

Routing UI5-navTo未在尚未显示的页面上启动onInit事件,routing,sapui5,Routing,Sapui5,我有一个具有3个级别的UI5应用程序 /家 登录页,其中显示多个项目。左侧有一个导航面板,其中包含指向所有项目列表的链接。导航面板由属性为itemSelect=onItemSelect的控件完成。此onItemSelect函数如下所示 onItemSelect: function (oEvent) { const item = oEvent.getParameter('item'); this.getRouter().navTo(i

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

  • /家
  • 登录页,其中显示多个项目。左侧有一个导航面板,其中包含指向所有项目列表的链接。导航面板由属性为
    itemSelect=onItemSelect
    的控件完成。此
    onItemSelect
    函数如下所示

            onItemSelect: function (oEvent) {
                const item = oEvent.getParameter('item');
                this.getRouter().navTo(item.getKey());
            },
    
  • /主页/项目
  • 所有项目的列表。可以单击每个项目。在此项目列表的控制器上,有一个
    onInit
    函数,用于从数据库加载项目列表

  • /home/items/{itemId}-项目详细信息
  • 问题是中的items列表上的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 in控制器:

        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"
            });
        }
    });
    
    }))


    -->来源:

    好的,问题解决了。正如我所说的,问题是onInit甚至没有被执行。这是由我犯的一个错误引起的,当我复制粘贴代码时,忘记更改初始行-因此items list和items details在开始时都扩展了同一个控制器,忘记了为item details重写代码

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

    因此,如果项目详细信息的显示时间早于项目列表,那么他们也会调用项目列表的控制器,并且在实际项目列表显示时不会调用该控制器。你的应用程序中的大多数东西现在还没有准备好。它触发一次,通常在路由器启动之前。如果你像你看起来那样使用路由器,一个更好的选择是
    这个.getRouter().getRoute('routename').attachPatternMatched(函数(oEvent)…
    。把它放在你控制器的
    onInit