扩展控件重用它自己的原始渲染器

Extending a control reusing its own original renderer

我的应用程序中需要一个自定义控件,由一个 ColumnListItem 后跟一个跨越所有 ColumnListItem 宽度的(自定义)进度条组成。 我尝试扩展 sap/m/ColumnListItem 添加新的自定义聚合 progress 并利用其原始 renderer 如下:

sap.ui.define([
  "sap/m/ColumnListItem",
  "sap/m/ColumnListItemRenderer"
], function (ColumnListItem, ColumnListItemRenderer) {
  "use strict";
  return ColumnListItem.extend("my.package.MyColumListItem", {
    metadata: {
      aggregations: {
        "progress": {
          type: "my.package.MyShadowBar",
          multiple: false
        }
      }
    },
    renderer: {
      apiVersion: 2,
      render: function (oRm, oCLI) {
        ColumnListItemRenderer.render.apply(this, arguments);
        oRm.openStart("div").style("width", "100vw").openEnd();
        oRm.renderControl(oCLI.getAggregation("progress"));
        oRm.close("div");
      }
    }
  });
});

不幸的是,这仅在第一次呈现时有效:如果我导航到其他地方然后返回,所有进度条都呈现在页面顶部,所有 ColumnListItems 都堆叠在底部。 我正在使用 SAPUI5 版本 1.84.xx。 我真的不明白如何正确实现渲染器,所以欢迎任何建议!

SAPUI5 在技术上允许从父控件的相应 *Renderer 模块覆盖现有方法。除了自动测试 之外,请确保仅使用 @protected/@public JSDoc 标记 覆盖那些方法,以使您的应用与未来的 UI5 版本保持兼容。这是一个如何通过覆盖受保护的 addOuterClasses 方法来扩展 InputRenderer 的示例:.

也可以在 外部 渲染器中扩展父级 *Renderer,如 API reference Renderer.extend 所述。扩展定义保持不变。


在您的情况下,听起来无需扩展​​ sap.m.ColumnListItem 即可实现要求。无论哪种方式,这里有一个 minimal sample that showcases both approaches:通过扩展项渲染器渲染进度条,并通过没有任何扩展的标准 popin 方法渲染进度条。