2013-11-02 47 views
2

我使用预编译的客户端应用程序,这些应用程序都是用我需要扩展的Dojo 1.8(AMD样式)编写的。Dojo:覆盖预装的模块

我有权访问源代码,但希望在可能的地方使其保持不变,而是倾向覆盖(这就是应用程序插件框架的工作原理,其他任何东西都是黑客)。

我的脚本只在基本应用程序脚本之后加载。例如,我不能修改djConfig,也不能在加载基本应用程序模块之前发生其他任何事情。

这是我的问题:我想扩展其中一个基本应用程序类(使用declare创建),并在全局范围内应用我的覆盖 - 即使在已经需要包含此类的模块的预加载模块上(但尚未实例化它)。

到目前为止,我发现的最佳解决方案是使用require()来为包含类的模块别名。但是,这只适用于我可以注册别名后需要该类的模块。

+2

最好的办法是只覆盖的原型您要编辑的模块。您可以直接使用原型或使用dojo.extend来完成此操作。另外看起来“道场猴修补” – tik27

回答

3

Dojo AMD Loader documentation状态:

一旦模块值已进入模块命名空间,它是 在每次需要的时间不重新计算。在实际的水平上,这个 意味着工厂只被调用一次,并且返回的值是 在使用给定模块的所有代码中被缓存和共享。 (注: 道场装载机包括非标准功能require.undef,这 取消定义模块值)

这意味着,如果修改了模块的原型,这种变化将在整个应用程序传播,甚至到更改之前创建的实例,因为这是JavaScript的工作原理。

要修改原型通过dojo/_base/declare创建的类,有在构造函数中定义的extend()方法:

require(['App'], function(App) { 
    App.extend({ 
     run: function() { 
      // override `run` method here   
     } 
    }); 
}); 

看到它在行动:http://jsfiddle.net/phusick/HxkFs/

+1

这正是我正在寻找。非常感谢! –