Leo*_*mos 4 inheritance sapui5
我正在尝试创建一个具有通用方法和通用onInit逻辑的基本控制器。
使用该extend方法将方法从基本控制器添加到子控制器,但生命周期方法被完全覆盖。
据我了解,扩展功能应该替换已被重写的常见方法,但它应该按各自的顺序从基本控制器和扩展控制器执行生命周期方法。
所以我的问题如下:
示例代码:
家长控制器
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");
},
// ...
});
});
Run Code Online (Sandbox Code Playgroud)
子控制器
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");
},
// ...
});
});
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,此示例仅记录“extend init”。我希望它按此顺序记录“可重用 init”和“扩展 init”。
我省略了一些代码,但主要思想体现在这两个控制器上。唯一相关的元数据是基本控制器是抽象的。
在许多情况下,当从头开始开发应用程序时,正如 Benedikt 所解释的那样, BaseController方法就足够了,或者您可以尝试使用许多微型模块进行组合,具体取决于您的项目。
主题控制器扩展不太为人所知,但值得了解它的含义以及扩展如何帮助我们进行应用程序开发。
该文档确实暗示,扩展概念通常针对想要使用附加功能扩展现有应用程序的开发人员。但扩展也可用于在您自己的应用程序开发中重用某些逻辑。
[控制器扩展]可以用作[...]作为添加到原始应用程序中的可重用部分。(来源)
目前有两种做法:
名为“组件配置”的旧概念
(扩展在 中manifest.json或以前在 中声明Component.js)
看看这个例子。
称为“控制器扩展”的新概念(使用控制器中的
模块"sap/ui/core/mvc/ControllerExtension"和部分)methodsmetadata
public: true | false)final: true | false)overrideExecution: "After" | "Before" | "Instead")ControllerExtension.override(自 1.112 起首选)。.overrides例如,请参见这个 plunk 。
无论哪种情况,UI5 默认都会按以下顺序执行生命周期方法:
| 执行顺序 | 原始控制器代码 | 扩展代码 |
|---|---|---|
| 1. | onInit |
|
| 2. | onInit |
|
| 3. | onBeforeRendering |
|
| 4. | onBeforeRendering |
|
| 5. | onAfterRendering |
|
| 6. | onAfterRendering |
|
| 7. | onExit |
|
| 8. | onExit |