Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sapui5 控制器中的组合而不是继承_Sapui5 - Fatal编程技术网

Sapui5 控制器中的组合而不是继承

Sapui5 控制器中的组合而不是继承,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,

我想实现如下结构以避免“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,

        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);
这无法工作,因为您的helper
sap.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);
这无法工作,因为您的helper
sap.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上的任何绑定过程。这种方法的问题是,我丢失了指向控制器本身的任何链接,这对我来说毫无用处:/在处理程序的范围内,
可能是您的控制器实例。