UI5 控制器和生命周期方法的扩展

Leo*_*mos 4 inheritance sapui5

我正在尝试创建一个具有通用方法和通用onInit逻辑的基本控制器。

使用该extend方法将方法从基本控制器添加到子控制器,但生命周期方法被完全覆盖

  • 我尝试使用此文档页面override.onInit上显示的方法,但它不起作用。
  • 我也尝试过sap.ui.component 这样的操作,但我根本无法让它工作。
    我不确定它是否适用于 AMD 语法。

据我了解,扩展功能应该替换已被重写的常见方法,但它应该按各自的顺序从基本控制器和扩展控制器执行生命周期方法。

所以我的问题如下:

  1. 这种行为可能实现吗?如果是这样,我做错了什么?
  2. 有没有更好的方法来实现呢?

示例代码:

家长控制器

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”。

我省略了一些代码,但主要思想体现在这两个控制器上。唯一相关的元数据是基本控制器是抽象的。

Bog*_*ann 5

在许多情况下,当从头开始开发应用程序时,正如 Benedikt 所解释的那样, BaseController方法就足够了,或者您可以尝试使用许多微型模块进行组合,具体取决于您的项目。

主题控制器扩展不太为人所知,但值得了解它的含义以及扩展如何帮助我们进行应用程序开发。

该文档确实暗示,扩展概念通常针对想要使用附加功能扩展现有应用程序的开发人员。但扩展也可用于在您自己的应用程序开发中重用某些逻辑。

[控制器扩展]可以用作[...]作为添加到原始应用程序中的可重用部分。(来源)

目前有两种做法:

  1. 名为“组件配置”的旧概念
    (扩展在 中manifest.json或以前在 中声明Component.js

    • 较旧的 UI5 版本支持。
    • 除了原始方法之外,还会调用生命周期方法(见下表)。
    • 具有相同名称的非生命周期方法将被扩展完全覆盖。
    • 简单且具有声明性,但缺少定义清晰接口的可能性,哪些方法可以按何种顺序扩展。

    看看这个例子。

  2. 称为“控制器扩展”的新概念(使用控制器中的
    模块"sap/ui/core/mvc/ControllerExtension"和部分)methodsmetadata

    • 自 1.56 起公开记录,但到目前为止还没有样本
    • 除了原始方法之外,还会调用生命周期方法(与旧方法相同)。
    • 提供了定义清晰接口的可能性:
      • 能见度 ( public: true | false)
      • 可重写性 ( final: true | false)
      • 执行策略 ( overrideExecution: "After" | "Before" | "Instead")
      • 允许通过 static 扩展基本控制器本身的扩展方法ControllerExtension.override自 1.112 起首选)。.overrides
    • 可用于添加可重用的JS部分(相当于片段概念)。

    例如,请参见这个 plunk 。

生命周期执行顺序

无论哪种情况,UI5 默认都会按以下顺序执行生命周期方法:

执行顺序 原始控制器代码 扩展代码
1. onInit
2. onInit
3. onBeforeRendering
4. onBeforeRendering
5. onAfterRendering
6. onAfterRendering
7. onExit
8. onExit