2014-02-18 30 views
2

我正在使用最新的qooxdoo SDK(3.5),并试图找到动态加载模块的方法。每个模块都会实现一个“init”函数,该函数在应用程序中创建一个窗口,并且从这一点开始,它是自包含的。有谁知道动态加载qooxdoo模块的方法吗?

我需要的是能够在不知道模块事先存在的情况下调用任意的init函数。例如,某人上传自定义模块并尝试运行它 - 我只需要调用模块的init函数(或者如果调用失败,则返回错误)。

任何想法?

编辑:

喜欢的东西:

function loadModule(modName) { 
    var mod = new qx.something.loadModule(modName); 
    mod.init(); 
} 
+0

你怎么想_detect_,它的上传? – abarnert

+0

无所谓,如果它不在那里,我只是显示一个错误。 – jpreed00

+0

我不清楚你想要做什么。你想接受一个新的模块,然后立即动态加载它?或者你想要某种插件机制,人们可以上传新的插件,每次你的应用程序启动时,所有这些插件都会被加载?或者有些不同? – abarnert

回答

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向我透露。 (源代码可以在桌面下载的一部分。)

操场从编辑器读取代码,并创建一个匿名函数出来,然后执行相应的功能。有一堆设置和拆除游乐场围绕下面的代码,但为了简洁和清晰,我已经将它删除。如果您有兴趣自己做类似的事情,我强烈建议查看游乐场应用程序的源代码。动态代码执行包含在810行开始的__updatePlayground函数中(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“呼”地执行匿名函数。

0

请定义模块。

Qooxdoo源代码使用与Java相同的约定 - 每个文件一个类。你真的想单独加载类并处理依赖关系吗?如果不是,你对模块的定义是什么?

除此之外,qooxdoo还有一个包的概念,它是一组类,接口和mixins,框架,contribs,包括框架本身,由生成器以优化方式打包,以便早期使用的类是加载较早。使用qooxdoo自己的打包机制不需要比使用自定义参数运行构建或定制config.json更多的努力 - 所有这些在手册中都有详细介绍。

如果你对某个模块的想法是某种子应用程序,其中大部分与大型应用程序中的所有其他应用程序都是分离的,但我不确定在没有显着修改生成器代码的情况下可以实现这一点(使用./generate.py调用)或接受一些大小的开销。

我不会详细介绍修改发生器 - 如果你走这条路,你需要深入挖掘,你会学到的东西比我对发生器的了解还要多。

你可以在qooxdoo允许的范围内做什么,就是为每个模块创建一个单独的岛应用程序,通过附加到顶部窗口的JavaScript为模块间通信建立自己的基础架构,并在主页面内运行模块,还有一些手动添加的魔术,使得各个模块的行为类似于选项卡窗格或qooxdoo窗口。除了一些尴尬的定制非qooxdoo代码之外,您必须花费的开销是所有模块都将重新加载qooxdoo框架代码。