在" sap.ui.define"中编写SAPUI5控件渲染器风格

时间:2016-04-01 08:38:04

标签: sapui5

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

  

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

我还没有找到任何不使用导出黑客的渲染器​​实现的例子,如果这种方式存在,我有疑问。

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

  • 忽略SAP要求并使用bExport = true。优点:SAP代码的最高重用率,通常遵循标准逻辑。缺点:避免官方建议。
  • 从工厂函数中明确设置my.namespace.control.GreatControlRenderer。优点:简单,不会触及bExport。缺点:打破模块化设计(因为模块实际上设置了全局变量)。

解决此问题的最佳或推荐方法是什么?

从技术上讲,可以在框架代码中使用jQuery.sap.setObject方法创建可供公共使用的对象引用,它们都在:

  1. sap.ui.core.Control.extend() - 实际上在父类方法中 sap.ui.base.Metadata.createClass()
  2. sap.ui.define(/* bExport = */ true)
  3. 此方法按对象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;
      }
    };
    

1 个答案:

答案 0 :(得分:3)

首先,您的渲染器是一个具有渲染功能的对象。这是一个静态功能。从模块中返回此渲染器。

sap.ui.define([], function(){
  var MyControlRenderer = {};
  MyControlRenderer.render = function(oRm, oControl){
    //Render your control
  };
  return MyControlRenderer;
});

然后在您的控件中导入Renderer对象并将其指定给控件的渲染器属性,如下所示:

sap.ui.define([
 "sap/ui/core/Control",
 "./MyControlRenderer"
], function (Control, MyControlRenderer) {
  var MyControl = Control.extend("bla.MyControl", {
    metadata: {
       //...
    },
    renderer: MyControlRenderer
  });
  return MyControl;
});

在此示例中,渲染器与控件位于同一目录中。