Sapui5 控制器中的组合而不是继承
我想实现如下结构以避免“BaseController”超类: controller/helpers/Navigation.jsSapui5 控制器中的组合而不是继承,sapui5,Sapui5,我想实现如下结构以避免“BaseController”超类: controller/helpers/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,
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");
}
});
});
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);
}
});
});
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()
});
});
controller/Something.controller.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");
}
});
});
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);
}
});
});
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()
});
});
然后XML视图指向onPress事件,如下所示:
<semantic:FullscreenPage
navButtonPress="navigation.onNavBack"
showNavButton="true"> ...
这种方式就像@hirse建议的那样(在视图中的路径前面放置一个
),但这会使我失去与控制器的任何链接,这会使helper类变得太有限,而且几乎没有用处
但这让我猜测,仅仅通过设置
this.navigation=new navigation(this)
它就遗漏了绑定方面的任何内容。您的方法看起来很有趣,我认为这可能是一个好主意
现在谈谈你的具体问题:
处理程序函数前面缺少一个
:.navigation.onNavBack
引述:
- 始终假定以点('.')开头的名称表示控制器中的方法
- 在后面位置包含点的名称被假定为表示全局函数
- 没有点的名称被解释为相对名称;如果未找到任何内容,则将其解释为绝对名称
onNavBack
将使用控制器中的功能(如果有),否则继续查看.onNavBack
将期望控制器中有一个功能navigation.onNavBack
只会查找全局函数.navigation.onNavBack
是您想要使用的。您的方法看起来很有趣,我认为这可能是个好主意
现在谈谈你的具体问题:
处理程序函数前面缺少一个
:.navigation.onNavBack
引述:
- 始终假定以点('.')开头的名称表示控制器中的方法
- 在后面位置包含点的名称被假定为表示全局函数
- 没有点的名称被解释为相对名称;如果未找到任何内容,则将其解释为绝对名称
onNavBack
将使用控制器中的功能(如果有),否则继续查看.onNavBack
将期望控制器中有一个功能navigation.onNavBack
只会查找全局函数.navigation.onNavBack
是您想要使用的。我认为以下调用无法工作:
this.navigation = new Navigation(this);
这无法工作,因为您的helpersap.cre.core.ui.controller.helpers.Navigation
没有声明一个构造函数,该构造函数可以接受您正在传递的一个参数(对控制器的引用)。我猜你是在假设新导航(这个)
将调用您的onInit(…),由于某种魔力,将传递对控制器的引用。但这是不对的。请确保声明构造函数,有关详细信息,请参阅。在您的情况下,对onNavBack
的任何调用都将导致错误,因为您的此。_控制器未定义,对吗
我过去曾与sap.ui.define一起使用过类似的方法。但是我没有返回sap.ui.base.Object.extend(…),而是使用本机OOJavaScript。。。
这帮助我摆脱了sap.ui.base.Object。但是,您可能有充分的理由保持这种依赖性…我认为以下调用无法工作:
this.navigation = new Navigation(this);
这无法工作,因为您的helpersap.cre.core.ui.controller.helpers.Navigation
没有声明一个构造函数,该构造函数可以接受您正在传递的一个参数(对控制器的引用)。我猜你是在假设新导航(这个)
将调用您的onInit(…),由于某种魔力,将传递对控制器的引用。但这是不对的。请确保声明构造函数,有关详细信息,请参阅。在您的情况下,对onNavBack
的任何调用都将导致错误,因为您的此。_控制器未定义,对吗
我过去曾与sap.ui.define一起使用过类似的方法。但是我没有返回sap.ui.base.Object.extend(…),而是使用本机OOJavaScript。。。
这帮助我摆脱了sap.ui.base.Object。但是,您可能有一个很好的理由保持这种依赖性…您所要做的就是重新定义Navigation.js的构造函数
constructor: function(controller) {
this._controller = controller;
},
现在您有了对主控制器的引用…您所要做的就是重新定义Navigation.js的构造函数
constructor: function(controller) {
this._controller = controller;
},
现在你有了一个对主控制器的引用…hummm,当把
放在前面时,就像.onNavBack
一样,实际上它是工作的;但是当把它放在一个名称空间中时,比如.navigation.onNavBack
,它仍然不能工作,同样的方式。如果我将navigation
声明为属性,与onInit
处于同一级别,它将按照您的建议工作,这可能意味着通过设置this.navigation
,它将丢失ran上的任何绑定过程。这种方法的问题是,我错过了指向控制器本身的任何链接,这对我来说毫无用处:/在处理程序的范围内,这个
可能是你的控制器实例。哼哼,当把
放在前面时,比如.onNavBack
,实际上它是有效的;但是当把它放在一个名称空间中时,比如.navigation.onNavBack
,它仍然不能工作,同样的方式。如果我将navigation
声明为属性,与onInit
处于同一级别,它将按照您的建议工作,这可能意味着通过设置this.navigation
,它将丢失ran上的任何绑定过程。这种方法的问题是,我丢失了指向控制器本身的任何链接,这对我来说毫无用处:/在处理程序的范围内,此
可能是您的控制器实例。