我正在尝试创建一个具有通用方法和通用
onInit
逻辑的基本控制器。
使用
extend
方法将基础控制器的方法添加到子控制器,但生命周期方法被覆盖完全。
本文档页面上显示的
override.onInit
方法,但它没有用。sap.ui.component
像这样但我根本无法让它工作。据我所知,扩展功能应该替换已被重写的通用方法,但它应该根据各自的顺序从基础控制器和扩展控制器执行生命周期方法。
所以我的问题如下:
示例代码:
家长控制器
sap.ui.define([
"sap/ui/core/mvc/Controller"
], function (Controller) {
"use strict";
return Controller.extend("my.namespace.controller.App", {
onInit: function () {
console.log("reusable init");
},
// ...
});
});
儿童控制器
sap.ui.define([
"my/namespace/controller/App.controller"
], function (Controller) {
"use strict";
return Controller.extend("my.namespace.child.controller.App", {
onInit: function () {
console.log("extend init");
},
// ...
});
});
此示例仅在我运行应用程序时记录“extend init”。我希望它按此顺序同时记录“可重用初始化”和“扩展初始化”。
我省略了一些代码,但主要思想在这两个控制器上得到了体现。唯一相关的元数据是基本控制器是抽象的。
在许多情况下,当从头开始开发应用程序时,BaseController 方法就足够了,正如 Benedikt 解释的那样,或者您可以尝试使用许多小模块进行组合,具体取决于您的项目。
主题控制器扩展鲜为人知,但值得了解它的内容以及扩展如何帮助我们进行应用程序开发。
文档确实暗示扩展概念通常针对想要扩展 existing 具有附加功能的应用程序的开发人员。但是扩展也可以用来在你自己的应用程序开发中重用一些逻辑。
[控制器扩展] 可以用作 [...] 作为添加到原始应用程序的 可重用部分。 (来源)
目前有两种做法:
名为“组件配置”的旧概念
(扩展在
manifest.json
或以前在Component.js
中声明)
看,这个plunk例如。
称为“控制器扩展”的新概念
(使用模块
"sap/ui/core/mvc/ControllerExtension"
和控制器methods
中的metadata
部分)
public: true | false
)final: true | false
)overrideExecution: "After" | "Before" | "Instead"
)ControllerExtension.override
扩展基本控制器本身的扩展方法(.overrides
首选 自 1.112)。参见this plunk例如。
无论哪种情况,UI5默认按照以下顺序执行生命周期方法:
执行顺序 | 原控制器代码 | 分机号 |
---|---|---|
1. |
|
|
2. |
|
|
3. |
|
|
4. |
|
|
5. |
|
|
6. |
|
|
7. |
|
|
8. |
|
我不知道 UI5 中有一个覆盖机制,它看起来设计过度...... 我的猜测是您使用的是没有适当支持的旧版本。
无论如何,js-inheritance 开箱即用。你需要打电话给“超级”。
sap.ui.define([
"example/BaseController"
], function (BaseController) {
"use strict";
return BaseController.extend("example.BaseController2", {
onInit: function () {
// this is the "super" call
// same happens if you call super() on es6 classes
BaseController.prototype.onInit.apply(this, arguments);
}
});
});
有关更多信息,请查看此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain