我使用预构建的客户端应用程序,所有客户端应用程序都是用Dojo 1.8(AMD风格)编写的,我需要扩展它。
我可以访问源代码,但希望尽可能保持不变,而是支持覆盖(这就是应用程序插件框架的工作方式,其他任何东西都是黑客)。
我的脚本仅在基本应用程序脚本之后加载。我不能修改djConfig,也不能修改加载基本应用程序模块之前的任何其他内容。
这是我的问题:我想扩展一个基本应用程序类(使用declare创建)并全局应用我的覆盖 - 即使在已经需要包含此类的模块的预加载模块上(但尚未实例化)它)。
到目前为止,我找到的最佳解决方案是使用require()来对包含该类的模块进行别名。但这只适用于我可以注册别名后需要该类的模块。
答案 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
}
});
});