我正在使用JSON格式的Javascript和Appdescriptors。
我想要做的是创建一个Class的实例,其中classname在// not leap year
中保存为字符串。如果不是这种情况,我想采取oModelConf[sModelName].type
Related Question提供了这个解决方案:
"sap.ui.model.odata.ODataModel"
我认为这不是一个很好的解决方案。
编辑它对我不起作用,因为我的类未在窗口中定义,因此function instantiate(className, args) {
var o, f, c;
c = window[className]; // get reference to class constructor function
f = function(){}; // dummy function
f.prototype = c.prototype; // reference same prototype
o = new f(); // instantiate dummy function to copy prototype properties
c.apply(o, args); // call class constructor, supplying new object as context
o.constructor = c; // assign correct constructor (not f)
return o;
}
未定义。我不知道在SAPUI5中我的功能定义在哪里
第二个解决方案:
window[className]
这不是更好的解决方案,因为我们不应该使用eval(`a = new ${oModelConf[sModelName].type || "sap.ui.model.odata.ODataModel"}(sServiceUrl, true);`);
。
有更好的解决方案吗?
EDIT2 由于the url in pimskies answer我找到了另一个解决方案:
由于eval()
与window.sap.ui.model.odata.ODataModel
相同,sap.ui.model.odata.ODataModel
与window.sap
相同
我可以接受我的字符串,并将所有window[sap]
替换为.
,将右括号放在前面和后面。
我不会编写代码,因为它不是一个解决方案。(我不应该编写][
的东西......)
答案 0 :(得分:3)
您可以使用jQuery.sap.getObject访问该课程:
20px
编辑:另一种方式(如果您使用AMD,我会推荐)
如果您使用的是现代AMD modules并且您不知道是否已加载包含您的类的模块,则应使用sap.ui.require()异步加载模块。它需要通过unified resource name指定模块(转换可能是最难看的部分):
var ModelClass = jQuery.sap.getObject(oModelConf[sModelName].type || "sap.ui.model.odata.ODataModel");
var model = new ModelClass();
答案 1 :(得分:0)
也许将字符串映射到一个类?
function Foo() {
console.log('new foo');
}
function Bar() {
console.log('new bar');
}
var objects = {
'foo': Foo,
'bar': Bar
};
var cls = objects.foo || Bar;
new cls();
答案 2 :(得分:0)
两者结合在一起的是什么?由于window[className]
失败,请将其替换为
oModelConf[className].type || sap.ui.model.odata.ODataModel
...
function instantiate(className, args) {
var o, f, c;
c = oModelConf[className] || sap.ui.model.odata.ODataModel;
f = function(){}; // dummy function
f.prototype = c.prototype; // reference same prototype
o = new f(); // instantiate dummy function to copy prototype properties
c.apply(o, args); // call class constructor, supplying new object as context
o.constructor = c; // assign correct constructor (not f)
return o;
}