我想以新的sap.ui.define
方式编写自定义控件。我在单独的文件中实现控件渲染器时遇到问题:似乎必须放置bExport = true
,而这是forbidden by SAP。
bExport:是否需要导出到全局名称 - 仅由SAP拥有的代码使用
我还没有找到任何不使用导出黑客的渲染器实现的例子,如果这种方式存在,我有疑问。
我有一些建议,但他们并不能完全满足我:
bExport = true
。优点:SAP代码的最高重用率,通常遵循标准逻辑。缺点:避免官方建议。my.namespace.control.GreatControlRenderer
。优点:简单,不会触及bExport
。缺点:打破模块化设计(因为模块实际上设置了全局变量)。解决此问题的最佳或推荐方法是什么?
从技术上讲,可以在框架代码中使用jQuery.sap.setObject
方法创建可供公共使用的对象引用,它们都在:
sap.ui.core.Control.extend()
- 实际上在父类方法中
sap.ui.base.Metadata.createClass()
sap.ui.define(/* bExport = */ true)
此方法按对象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;
}
};
答案 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;
});
在此示例中,渲染器与控件位于同一目录中。