在“中写入SAPUI5控件渲染器”;sap.ui.define";风格

在“中写入SAPUI5控件渲染器”;sap.ui.define";风格,sapui5,Sapui5,我想以新的sap.ui.define方式编写自定义控件。我在一个单独的文件中实现控件渲染器时遇到了一个问题:似乎必须将bExport=true,而这是一个单独的文件 BeExport:是否需要导出到全局名称-应仅由SAP拥有的代码使用 我还没有发现任何渲染器实现不使用export hack的例子,我怀疑这种方法是否存在 我有一些建议,但并不完全满足我: 忽略SAP要求并使用beexport=true。优点:SAP代码的最高重用率,通常遵循标准逻辑。缺点:避免官方建议 从工厂函数内显式设置my.

我想以新的
sap.ui.define
方式编写自定义控件。我在一个单独的文件中实现控件渲染器时遇到了一个问题:似乎必须将
bExport=true
,而这是一个单独的文件

BeExport:是否需要导出到全局名称-应仅由SAP拥有的代码使用

我还没有发现任何渲染器实现不使用export hack的例子,我怀疑这种方法是否存在

我有一些建议,但并不完全满足我:

  • 忽略SAP要求并使用
    beexport=true
    。优点:SAP代码的最高重用率,通常遵循标准逻辑。缺点:避免官方建议
  • 从工厂函数内显式设置
    my.namespace.control.GreatControlRenderer
    。优点:简单,不接触
    beexport
    。缺点:破坏模块化设计(因为模块实际上设置了全局变量)
解决此问题的最佳或推荐方法是什么


从技术上讲,可供公共使用的对象引用是在框架代码内使用方法创建的,包括:

  • sap.ui.core.Control.extend()
    ——实际上在父类方法中
  • 此方法通过对象
    dot.separated.qualified.name
    在全局范围内创建对象的层次结构,如下所示:

    jQuery.sap.setObject = function(sName, vValue, oContext) {
      var oObject = oContext || window,
          aNames = (sName || "").split("."),
          l = aNames.length,
          i;
    
      if (l > 0) {
        for (i = 0; oObject && i < l - 1; i++) {
          if (!oObject[aNames[i]]) {
            oObject[aNames[i]] = {};
          }
          oObject = oObject[aNames[i]];
        }
        oObject[aNames[l - 1]] = vValue;
      }
    };
    
    jQuery.sap.setObject=函数(sName、vValue、oContext){
    var oObject=oContext | |窗口,
    aNames=(sName | | |“).split(“.”),
    l=aNames.length,
    我
    如果(l>0){
    对于(i=0;oObject&&i
    首先,渲染器是一个具有渲染功能的对象。这是一个静态函数。从模块返回此渲染器

    sap.ui.define([],function(){
    “严格使用”;
    var MyControlRenderer={};
    MyControlRenderer.apiVersion=2;
    MyControlRenderer.render=函数(oRm、oControl){
    //呈现你的控制
    };
    返回mycover;
    });
    
    然后在控件中,导入渲染器对象并将其指定给控件的Renderer属性,如下所示:

    sap.ui.define([
    “sap/ui/core/Control”,
    “/MyControl渲染器”
    ],函数(控件,MyControl渲染器){
    “严格使用”;
    var MyControl=Control.extend(“bla.MyControl”{
    元数据:{
    // ...
    },
    渲染器:MyControl渲染器
    });
    返回MyControl;
    });
    

    在本例中,呈现程序与控件位于同一目录中。

    对于其他读者:UI5中存在一个错误,如果控件从抽象类(例如sap/ui/core/TooltipBaseRenderer.js不存在)扩展,则获取不存在的
    *renderer.js
    文件。现在通过提交解决了这一问题,从UI5 1.82.0开始应该可以使用+