Dojo:覆盖预加载模块

时间:2013-11-02 01:29:22

标签: dojo requirejs amd

我使用预构建的客户端应用程序,所有客户端应用程序都是用Dojo 1.8(AMD风格)编写的,我需要扩展它。

我可以访问源代码,但希望尽可能保持不变,而是支持覆盖(这就是应用程序插件框架的工作方式,其他任何东西都是黑客)。

我的脚本仅在基本应用程序脚本之后加载。我不能修改djConfig,也不能修改加载基本应用程序模块之前的任何其他内容。

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

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

1 个答案:

答案 0 :(得分:4)

Dojo AMD Loader documentation州:

  

一旦将模块值输入模块名称空间,它就是   每次要求时都不会重新计算。在实际层面上,这个   表示工厂仅调用一次,返回值为   在使用给定模块的所有代码中缓存和共享。 (注意:   dojo loader包含非标准函数require.undef,其中   取消定义模块值。)

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

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

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

查看实际操作:http://jsfiddle.net/phusick/HxkFs/