我正在使用最新的qooxdoo SDK(3.5),我正在尝试找到一种动态加载模块的方法。每个模块都会实现一个“init”函数,该函数在应用程序中创建一个窗口,从那时起,它就是自包含的。
我需要的是能够在不知道预先存在的模块的情况下调用任意init函数。例如,某人上传了一个自定义模块并尝试运行它 - 我只需要调用模块的init函数(如果调用失败则输出错误)。
有什么想法吗?
编辑:
类似的东西:
function loadModule(modName) {
var mod = new qx.something.loadModule(modName);
mod.init();
}
答案 0 :(得分:3)
我找到了Qooxdoo运行动态代码的3种方法。第一种方式是通过内置零件装载机。 “部件”基本上是应用程序的一部分,qooxdoo将在您实际需要时“及时”加载 - 例如,操作很少使用的表单或对话框的类。这种方法并不是真正的动态(在我看来),因为它要求代码包含在Qooxdoo提供的构建过程中。准确地解释它的工作方式超出了这个答案的范围,坦率地说,我自己还不熟悉它。
第二种方法是通过qx.Class.getByName()函数调用。它的工作原理如下:
qx.Class.define("Bacon", {
extend: qx.core.Object,
construct: function(foo, bar) {
this.foo = foo;
this.bar = bar;
}
});
var klass = qx.Class.getByName("Bacon");
var obj = new klass("foo", "bar");
this.debug(obj.foo);
此方法可在Qooxdoo邮件列表here上找到。这个方法适用于构建过程和中包含的代码,用于动态引入的代码,但在我看来,第三种方法胜过,原因很简单,如果你动态地引入一个新类,你就是无论如何都必须使用第三种方法。
我找到的最终方法实际上是通过研究Qooxdoo playground的源代码向我揭示的。 (源代码可作为桌面下载的一部分提供。)
操场从编辑器中读取代码并从中创建一个匿名函数,然后执行该函数。游乐场围绕以下代码进行了一系列设置和拆卸,但为了简洁和清晰起见,我将其删除了。如果您有兴趣自己做类似的事情,我强烈建议您查看游乐场应用程序的源代码。动态代码执行包含在__updatePlayground函数中,从第810行开始(Qooxdoo v3.5)。
var fun;
try {
fun = qx.event.GlobalError.observeMethod(new Function(code));
} catch(ex) {
//do something with the exception
}
try {
fun.call();
} catch(ex) {
//do something with the exception
}
代码很简单,并使用built-in Javascript function“call”来执行匿名函数。
答案 1 :(得分:0)
请定义模块。
Qooxdoo源代码使用与Java相同的约定 - 每个文件一个类。你真的想单独加载类并处理依赖关系吗?如果没有,你对模块的定义是什么?
除此之外,qooxdoo有一个包的概念,包括类,接口和mixins,框架,contrib,包括框架本身,由生成器以优化的方式打包,以便加载前面使用的类早。使用qooxdoo自己的打包机制不需要比使用自定义参数运行构建或自定义config.json更多的努力 - 所有这些都在手册中详细描述。
如果您对模块的想法是一种子应用程序,大多与大应用程序中的其他内容分离,我不确定它是否可以实现而无需显着修改生成器代码(什么./generate.py调用)或接受一些规模的开销。
我不会详细介绍修改发电机的情况 - 如果你走这条路线,你还是需要深入挖掘,你将学到更多关于发电机的知识。
在qooxdoo允许的范围内,您可以做的是为每个模块创建一个单独的岛应用程序,通过附加到顶部窗口的JavaScript构建您自己的模块间通信基础架构,并在主页内运行模块,使用一些手动添加的魔法使各种模块的行为类似于tab窗格或qooxdoo窗口。除了一些笨拙的自定义非qooxdoo代码之外,您必须承担的开销是所有模块都将重新加载qooxdoo框架代码。