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

时间:2016-03-22 13:17:40

标签: sapui5

我想实现类似下面的结构,以避免使用“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.时,视图找不到该事件。

所以,我的问题是:

  • 有人在OpenUI5 / SAPUI5上看到了这样的方法吗?
  • 有任何不良后果吗?
  • 我认为视图无法调用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),它就会缺少关于路绑定的任何内容。

3 个答案:

答案 0 :(得分:1)

你的方法看起来很有趣,我认为这可能是一个好主意。

现在针对您的具体问题: 您在处理程序函数前面缺少..navigation.onNavBack

引用Developer Guide

  
      
  • 始终假定以点(&#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._controllerundefined,对吧?

我过去使用过类似的方法和sap.ui.define。但是我没有返回sap.ui.base.Object.extend(...),而是使用了原生的OO JavaScript ...... 这帮我摆脱了sap.ui.base.Object。但是,您可能有充分的理由保持这种依赖性......

答案 2 :(得分:0)

您所要做的就是重新定义Navigation.js的构造函数

constructor: function(controller) {
        this._controller = controller;
    },

现在你有一个对主控制器的引用......