Dojo:覆盖预加载模块
Posted
技术标签:
【中文标题】Dojo:覆盖预加载模块【英文标题】:Dojo: Override Pre-Loaded Module 【发布时间】:2013-11-02 01:29:21 【问题描述】:我正在使用一个预先构建的客户端应用程序,全部使用 Dojo 1.8(AMD 风格)编写,我需要对其进行扩展。
我可以访问源代码,但希望尽可能保持不变,而是支持覆盖(这就是应用程序插件框架的工作方式,其他任何东西都是黑客行为)。
我的脚本仅在基本应用程序脚本之后加载。例如,我不能修改 djConfig,也不能在加载基本应用程序模块之前发生任何其他事情。
这是我的问题:我想扩展一个基础应用程序类(使用声明创建)并在全局范围内应用我的覆盖——即使在已经需要包含此类的模块的预加载模块上(但尚未实例化)它)。
到目前为止,我发现的最佳解决方案是使用 require() 为包含该类的模块设置别名。但这仅适用于在我注册别名后需要该类的模块。
【问题讨论】:
最好的方法是覆盖你想要编辑的模块的原型。您可以直接使用原型或使用 dojo.extend 来执行此操作。另请查找“道场猴子修补” 【参考方案1】:Dojo AMD Loader documentation 声明:
一旦一个模块值被输入到模块命名空间中,它就是 每次需要时都不会重新计算。在实践层面上,这 表示 factory 只调用一次,返回值为 在使用给定模块的所有代码之间缓存和共享。 (注: 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/
【讨论】:
这正是我想要的。非常感谢!以上是关于Dojo:覆盖预加载模块的主要内容,如果未能解决你的问题,请参考以下文章