我想实现类似下面的结构,以避免使用“BaseController”超类:
控制器/助手/ Navigation.js
sap.ui.define([
"sap/ui/base/Object"
], function(Object) {
"use strict";
return Object.extend("sap.cre.core.ui.controller.helpers.Navigation", {
controller: null,
onInit: function(controller) {
this._controller = controller;
},
onNavBack: function() {
this._controller.getRouter().navTo("home");
}
});
});
控制器/ Something.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/cre/core/ui/controller/helpers/Navigation"
], function(Controller, Navigation) {
"use strict";
return Controller.extend("sap.cre.core.ui.controller.Something", {
onInit: function() {
this.navigation = new Navigation(this);
}
});
});
然后XML视图指向onPress事件,如下所示:
<semantic:FullscreenPage
navButtonPress="navigation.onNavBack"
showNavButton="true"> ...
但是当指向navigation.
时,视图找不到该事件。
所以,我的问题是:
navigation.onNavBack
的方法有什么问题?谢谢!
更新
我也是这样试过的:
控制器/ Something.controller.js
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/cre/core/ui/controller/helpers/Navigation"
], function(Controller, Navigation) {
"use strict";
return Controller.extend("sap.cre.core.ui.controller.Something", {
navigation: new Navigation()
});
});
这种方式可以像@hirse建议的那样工作(在视图中将.
放在路径前面),但这让我失去了与控制器的任何链接,这使得助手类太有限而且大多无用。
但它让我想到,仅仅通过设置this.navigation = new Navigation(this)
,它就会缺少关于路绑定的任何内容。
答案 0 :(得分:1)
你的方法看起来很有趣,我认为这可能是一个好主意。
现在针对您的具体问题:
您在处理程序函数前面缺少.
:.navigation.onNavBack
- 始终假定以点(&#39;。&#39;)开头的名称代表控制器中的方法。
- 假设在稍后位置包含点的名称代表全局函数
- 不带点的名称被解释为相对名称;如果没有找到,则将它们解释为绝对名称。
这意味着,
onNavBack
将使用控制器中的功能(如果有)并继续查看;
.onNavBack
期望控制器中有一个功能;
navigation.onNavBack
将仅寻找全局函数;
.navigation.onNavBack
是你想要使用的。
答案 1 :(得分:1)
我认为以下调用不起作用:
this.navigation = new Navigation(this);
这不起作用,因为你的帮助器sap.cre.core.ui.controller.helpers.Navigation
没有声明一个构造函数,它可以接受你传递的一个参数(对你的控制器的引用)。我猜你假设new Navigation(this);
将调用你的onInit(...)并且由于某些魔法,你的控制器的引用被传递。但那不对。确保声明构造函数,有关详细信息,请参阅sap.ui.base.Object。在您的情况下,对onNavBack
的任何调用都会导致错误,因为您的this._controller
是undefined
,对吧?
我过去使用过类似的方法和sap.ui.define。但是我没有返回sap.ui.base.Object.extend(...),而是使用了原生的OO JavaScript ...... 这帮我摆脱了sap.ui.base.Object。但是,您可能有充分的理由保持这种依赖性......
答案 2 :(得分:0)
您所要做的就是重新定义Navigation.js的构造函数
constructor: function(controller) {
this._controller = controller;
},
现在你有一个对主控制器的引用......