zyj0021
2009-08-11 21:11 阅读 475

关于dojo的require

最近对动态载入js,css文件的问题感兴趣,所以就对dojo的源代码进行了研究。
代码到是能看懂个八分左右,是利用了xml对象进行载入的
不过看完源代码,老是有点不踏实,所以想问下这个问题
如果在利用xml载入js脚本的时候,是同步,还是异步的呢??
这样我说个例子吧:
例如我有个函数
function doSomething()
{
    dojo.require('a.b');//也就是载入a/b.js文件
    //在a/b.js里面我会用个变量,例如我就在这个文件写var window.xx="1";其他什么都没有
     alert(window.xx);
}

问题:alert(window.xx);这句的执行,是在导入js文件载入完毕后执行呢,还是同步,也就是说在xml对象等待js载入过程中执行呢(这里举例可能简单,可以换个想法,如果载入的js文件很大或者网络不是很好的情况下,要花很长时间载入这个js文件)??

如果是同步完成呢,这样有可能因为上面的window.xx未初始化到,而导致后面的alert(window.xx)显示undefined?

还有个问题:按照官方的例子来,也出错:
我要导入自己的js文件,结构如下:
/myapp/js/dojo/dojo/dojo.js
/myapp/js/foo/bar.js

dojo.registerModulePath("foo", "../../foo");
dojo.require("foo.bar");

我这个bar.js就一个alert(1)看看是否有载入效果

结果:js文件载入成功,但是仍然报错,Could not load....

看源代码,registerModulePath只对_modulePrefixes[module]赋值了而没有对_loadedModules[moduleName]赋值
因为调用的时候用了_loadUriAndCheck这个方法,有一句                                           
return !! (ok && this._loadedModules[moduleName])

那个ok表示载入文件成功,因为this._loadedModules[moduleName]赋值而导致变成了false,而抛出异常

不知道这个是否是bug!我想应该不是吧,可能是我不知道怎么写这些代码需要哪些前提,或者需要设置下djConfig什么的,请熟悉dojo的人指教下或给个成功个例子打个包。






  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    iteye_9737 iteye_9737 2009-08-12 23:01

    补充一下:自定义的包一般应该和dojo、dijit、dojox放同级目录里。请参考:
    [code="javascript"]
    dojo.provide("dijit.Tree");
    //dijit和dojo是同级目录。。使用时可以直接dojo.require("dijit.Tree")
    [/code]

    点赞 评论 复制链接分享
  • iteye_9737 iteye_9737 2009-08-12 22:57

    dojo_base_loader\hostenv_browser.js 查看d._getText方法,可见require是同步请求--为了处理依赖关系。

    在你的例子中dojo.provide("foo.bar")即可dojo.require("foo.bar");
    registerModulePath不是你理解的那样。

    点赞 评论 复制链接分享

相关推荐