如何在 Dojo AMD 中包含遗留模块
Posted
技术标签:
【中文标题】如何在 Dojo AMD 中包含遗留模块【英文标题】:How to include legacy module in Dojo AMD 【发布时间】:2013-09-27 15:18:52 【问题描述】:我正在尝试将应用程序从 dojo 1.6 迁移到版本 1.9.1,并且我有一个我还不想迁移的遗留模块(它非常复杂,需要一些时间才能理解)。 Dojo 文档表明您可以将旧模块与 AMD 模块一起加载,但是当我尝试加载旧模块时,我会收到“dojo.provide is not a function”。
我的脚本:
require([..., "agsjs/dijit/TOC","dojo/domReady!"],
function(..., TOC)
on(map,'layers-add-result',function(results)
//Add Legend
var toc = new TOC(
map: map,
layerInfos:legendLayers
, 'legendDiv');
toc.startup();
);
);
模块第一行代码:
dojo.provide('agsjs.dijit.TOC');
在加载程序尝试加载 agsjs/dijit/TOC 模块之前,一切正常,我收到“dojo.provide 不是函数”错误。我如何解决这个问题而不必将整个模块重构为 AMD?谢谢
【问题讨论】:
一个搜索引擎把我带到了这里,所以我会在这里留下一个对我有帮助的链接:ilinkuo.wordpress.com/2013/02/07/… 【参考方案1】:为了加载遗留模块,你需要在遗留模式下运行加载器,这意味着你不能设置async: true
。只要您使用async: false
(默认)运行,您就可以从 AMD 模块加载和使用旧版模块,反之亦然。
【讨论】:
不按照教程。 “Dojo 加载程序独有的最后一个功能是能够将遗留 Dojo 模块与 AMD 样式模块混合匹配。这使得可以缓慢而有条不紊地从遗留代码库过渡到 AMD 代码库,而无需转换所有内容立即。这在加载器处于同步模式和异步模式时都有效”找到dojotoolkit.org/documentation/tutorials/1.8/modules 教程不正确。 Dojo Base(旧的dojo
对象)在异步模式下不会加载,典型的dojo.require
调用需要使用同步加载(除非您使用旧的XD 模式)。作为本教程的作者,我可以证明我写在那里的内容是错误的。当时,新加载程序的文档记录很差,也很难理解。
这是一个很好的例子,说明我为什么应该接受你的回答 ;-)。有什么方法可以帮助我在教程中更正这个问题(不是我现在理解加载器)?
教程已更新,更加准确。就贡献而言,不幸的是,教程是目前唯一没有受到良好源代码控制的文档(它位于旧的 Subversion 存储库中)。因此,没有简单的方法可以为它做出贡献。如果您有兴趣帮助文档,Dylan (dylan@dojotoolkit.org) 可以为您提供更多信息。【参考方案2】:
AMD 的一个优点是您现在不必使用“dojo”和“dijit”全局变量。如果您不想更改旧模块中的所有这些 dojo.xxx 调用,您可以尝试将旧模块包装在
define([
"dojo/_base/declare",
"dojo", "dijit",
...
], function(declare, dojo, dijit)
return declare([/*your parent widgets*/],
//your old module content at here, maybe you need make little modifications of your old module
);
);
所以那些 dojo.xxx 函数可能仍然有效。
此链接可能会提供您需要的一切:
http://dojotoolkit.org/reference-guide/1.9/releasenotes/migration-17.html
【讨论】:
这消除了错误,但代码实际上并没有工作。 这只是节省您将整个旧模块转换为 AMD 的时间。您仍然需要查看该文档如何使您的模块工作。例如,将 dojo.provide 替换为 declare. 查看我的修改版本以上是关于如何在 Dojo AMD 中包含遗留模块的主要内容,如果未能解决你的问题,请参考以下文章