UI5 - navTo 不会在尚未显示的页面上启动 onInit 事件
UI5 - navTo doesnt launch onInit event on page which wasnt displayed yet
我有一个具有 3 个级别的 UI5 应用程序
- /家
着陆页,其中显示了多个项目。在左侧,有一个导航面板,其中包含所有项目列表的 link。导航面板由具有 属性 itemSelect=onItemSelect
的 <tnt:NavigationList>
控件完成。这个 onItemSelect
函数看起来像这样
onItemSelect: function (oEvent) {
const item = oEvent.getParameter('item');
this.getRouter().navTo(item.getKey());
},
- /home/items
所有项目的列表。每个项目都可以点击。在这个项目列表的控制器上,有一个 onInit
函数从数据库中加载项目列表
- /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"
});
}
});
});
好的,问题解决了。正如我所说,问题是 onInit 甚至没有执行。这是由我犯的一个错误引起的,当我复制粘贴代码时忘记更改初始行 - 所以项目列表和项目详细信息在开始时都扩展了同一个控制器,忘记重写项目详细信息的代码。
`return BaseController.extend('xxx.portal.controller.item.itemList', {
因此,如果项目详细信息在项目列表之前显示,他们还会调用项目列表的控制器,并且在显示实际项目列表时不会调用它
我有一个具有 3 个级别的 UI5 应用程序
- /家
着陆页,其中显示了多个项目。在左侧,有一个导航面板,其中包含所有项目列表的 link。导航面板由具有 属性 itemSelect=onItemSelect
的 <tnt:NavigationList>
控件完成。这个 onItemSelect
函数看起来像这样
onItemSelect: function (oEvent) {
const item = oEvent.getParameter('item');
this.getRouter().navTo(item.getKey());
},
- /home/items
所有项目的列表。每个项目都可以点击。在这个项目列表的控制器上,有一个 onInit
函数从数据库中加载项目列表
- /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"
});
}
});
});
好的,问题解决了。正如我所说,问题是 onInit 甚至没有执行。这是由我犯的一个错误引起的,当我复制粘贴代码时忘记更改初始行 - 所以项目列表和项目详细信息在开始时都扩展了同一个控制器,忘记重写项目详细信息的代码。
`return BaseController.extend('xxx.portal.controller.item.itemList', {
因此,如果项目详细信息在项目列表之前显示,他们还会调用项目列表的控制器,并且在显示实际项目列表时不会调用它