我有一个具有3层的UI5应用程序
登录页面,其中,除其他外,显示几个项目。在左侧,有一个导航面板,其中包含指向所有项目列表的链接。导航面板由具有itemSelect=onItemSelect
属性的<tnt:NavigationList>
控件完成。此onItemSelect
函数如下所示
onItemSelect: function (oEvent) {
const item = oEvent.getParameter('item');
this.getRouter().navTo(item.getKey());
},
所有项目的列表。每一项都可以点击。在此项目列表的控制器上,有一个onInit
函数,用于从数据库加载项目列表
问题是项目列表上的onInit()并不总是被执行。如果我打开登录页(级别1),然后单击侧面导航以显示项目列表(级别2),则会执行onInit()并成功加载所有数据。
但是,我也可以选择打开登录页面(级别1),并从那里,单击一些最新的项目,直接显示它们的详细信息(级别3),绕过整个项目列表。然后,如果我单击侧面导航以显示项目列表(级别2),则不会执行onInit(),并且列表保持为空。
谁能给我解释一下为什么会发生这种情况,以及如何修复它?
我知道onInit()只执行一次,但我不明白为什么它不能在第一次显示的页面上执行。
发布于 2019-06-10 16:44:00
好了,问题解决了。正如我所说的,问题是onInit甚至没有被执行。这是由我做的一个bug引起的,当我复制代码时,忘记了更改初始行-所以项目列表和项目详细信息在一开始都扩展了同一个控制器,忘记了重写项目详细信息的代码。
`return BaseController.extend('xxx.portal.controller.item.itemList', {
因此,如果项目详细信息的显示时间早于项目列表,则它们也会调用项目列表的控制器,并且在显示实际项目列表时不会调用该控制器
发布于 2019-06-10 01:14:31
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://stackoverflow.com/questions/56496403
复制相似问题