如何init/Re-Init页面或再次触发onBeforeRendering?
How to init/Re-Init Page or trigger onBeforeRendering again?
我有一个带有磁贴的主屏幕,用户可以按该磁贴转到另一个页面。第二页的 onInit
在 getting/setting 模型中工作正常,数据显示正确。
如果我 'go back' 到第一页(在第二个屏幕上进行更改后),然后单击磁贴转到第二页,它 不会调用onInit
第二次 所以数据反映了所做的更改,而不是我想要的(真正的初始化数据)。我 尝试将 onInit
更改为 onBeforeRedendering
希望它能重新初始化 model/data 但它似乎没有正确重置所有内容。
有没有一种方法可以返回以强制在下次调用该页面时调用 onInit
?我想,如果我能做到,那么每次调用页面时都会调用 onInit
,这将解决我的问题。
这是我的 onInit
和 'go back' 控制器的部分......
sap.ui.define([
'sap/ui/core/mvc/Controller',
'sap/ui/model/json/JSONModel',
'sap/viz/ui5/controls/common/feeds/FeedItem',
'sap/m/MessageBox',
'sap/viz/ui5/data/FlattenedDataset'
], function(Controller, JSONModel, FeedItem, MessageBox, FlattenedDataset) {
"use strict";
var ColumnController = Controller.extend("controllers.Quarter", {
onInit: function(oEvent) {
var oRouter = sap.ui.core.routing.Router.getRouter("router");
var myView = this.getView();
var today = new Date();
var year = today.getFullYear();
var yr = year.toString();
var mnth = today.getMonth();
var qtr = Math.floor((mnth / 3));
this.makeYearList(yr);
var mthis = this;
var oModel = new sap.ui.model.json.JSONModel();
oModel.setData({
yr: yr
});
sap.ui.getCore().setModel(oModel);
myView.byId("mySelectMenu").setSelectedKey(yr);
myView.byId("mySelectMenu").attachChange(function() {
yr = this.getSelectedKey();
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
myView.byId("selQtr").attachChange(function() {
qtr = this.getSelectedKey();
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
oRouter.attachRouteMatched(function(oEvent) {
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
},
goBack: function() {
var oHistory = sap.ui.core.routing.History.getInstance();
var sPreviousHash = oHistory.getPreviousHash();
var oView = this.getView();
if (sPreviousHash) {
window.location.replace("#/" + sPreviousHash);
} else {
window.location.replace("#");
}
},
});
return ColumnController;
});
如有任何建议,我将不胜感激。
解决此问题的更好方法是,对第一页和第二页使用 shell。 Shell 将自动销毁您的内容(如果您在第二页,那么第一页的内容将被销毁,反之亦然)。否则,您需要手动销毁内容以解决重复 id 问题,您需要自己销毁并在需要的任何地方调用控制器。
将重置模型数据的逻辑放入路由匹配处理程序中。
我有一个带有磁贴的主屏幕,用户可以按该磁贴转到另一个页面。第二页的 onInit
在 getting/setting 模型中工作正常,数据显示正确。
如果我 'go back' 到第一页(在第二个屏幕上进行更改后),然后单击磁贴转到第二页,它 不会调用onInit
第二次 所以数据反映了所做的更改,而不是我想要的(真正的初始化数据)。我 尝试将 onInit
更改为 onBeforeRedendering
希望它能重新初始化 model/data 但它似乎没有正确重置所有内容。
有没有一种方法可以返回以强制在下次调用该页面时调用 onInit
?我想,如果我能做到,那么每次调用页面时都会调用 onInit
,这将解决我的问题。
这是我的 onInit
和 'go back' 控制器的部分......
sap.ui.define([
'sap/ui/core/mvc/Controller',
'sap/ui/model/json/JSONModel',
'sap/viz/ui5/controls/common/feeds/FeedItem',
'sap/m/MessageBox',
'sap/viz/ui5/data/FlattenedDataset'
], function(Controller, JSONModel, FeedItem, MessageBox, FlattenedDataset) {
"use strict";
var ColumnController = Controller.extend("controllers.Quarter", {
onInit: function(oEvent) {
var oRouter = sap.ui.core.routing.Router.getRouter("router");
var myView = this.getView();
var today = new Date();
var year = today.getFullYear();
var yr = year.toString();
var mnth = today.getMonth();
var qtr = Math.floor((mnth / 3));
this.makeYearList(yr);
var mthis = this;
var oModel = new sap.ui.model.json.JSONModel();
oModel.setData({
yr: yr
});
sap.ui.getCore().setModel(oModel);
myView.byId("mySelectMenu").setSelectedKey(yr);
myView.byId("mySelectMenu").attachChange(function() {
yr = this.getSelectedKey();
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
myView.byId("selQtr").attachChange(function() {
qtr = this.getSelectedKey();
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
oRouter.attachRouteMatched(function(oEvent) {
mthis.checkYr(yr, qtr);
mthis.recList(myView, yr, qtr);
});
},
goBack: function() {
var oHistory = sap.ui.core.routing.History.getInstance();
var sPreviousHash = oHistory.getPreviousHash();
var oView = this.getView();
if (sPreviousHash) {
window.location.replace("#/" + sPreviousHash);
} else {
window.location.replace("#");
}
},
});
return ColumnController;
});
如有任何建议,我将不胜感激。
解决此问题的更好方法是,对第一页和第二页使用 shell。 Shell 将自动销毁您的内容(如果您在第二页,那么第一页的内容将被销毁,反之亦然)。否则,您需要手动销毁内容以解决重复 id 问题,您需要自己销毁并在需要的任何地方调用控制器。
将重置模型数据的逻辑放入路由匹配处理程序中。