我正在处理一个项目,该项目需要从另一台服务器加载一些自定义Dojo小部件(即我们自己编写的小部件)。尽管几天来我尽了最大的努力,但我似乎无法让Dojo加载小部件。
Dojo从Google CDN加载,小部件从www.example.com加载,网站位于www.foo.com。
我不能发布实际的项目文件(这是一个公司的项目),但我用较小的测试文件复制了错误。
Test.html(在www.foo.com上):
<html>
<div id="content"></div>
<script>
var djConfig = {
isDebug: true,
modulePaths: {
'com.example': 'http://example.com/some/path/com.example'
}
}
</script>
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js.uncompressed.js"></script>
<script type="text/javascript">
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.addOnLoad(function() {
dojo.require("com.example.widget.Test", false);
dojo.addOnLoad(function() {
new com.example.widget.Test().placeAt(dojo.byId('content'));
});
});
</script>
</html>
Test.xd.js(网址:www.example.com/some/path.com/example/widget/Test.xd.js):
dojo.provide("com.example.widget.Test");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.declare("com.example.widget.Test", [dijit._Widget, dijit._Templated], {
templateString: "<div dojoAttachPoint="div">This is a test</div>",
postCreate: function() {
console.log("In postCreate");
console.log(this.div);
this.div.innerHTML += '!!!';
}
});
在Firebug中,我看到延迟几秒钟后出现错误,表示无法加载跨域资源com.example.widget.Test。然而,在"Net"选项卡中,我可以看到Test.xd.js已成功下载,并且我可以设置断点,并看到dojo.reclame执行并完成时没有出现错误。
我感谢你的帮助。如果我能提供任何其他信息,请告诉我。
XD加载程序中有一种不同的方法来处理模块声明。这是由于加载程序如何处理"模块就绪"事件。您很可能会体验到,dojo.addOnLoad从未运行过,因为它肯定"知道"这一点——一些必需的模块没有声明。
即便如此,它们很可能会被宣布——而dojotolkit的1.7+版本的变化似乎认识到了这一事实。我认为,原因是"模块就绪"机制没有在myModule.xd.js模块中正确实现。
它基本上是声明的"头"或"闭包",涉及几个步骤——从dojo.provide
和eof
包装基本模块中的所有内容
标准示例锅炉模块文件"{{modulePath}}/my/Tree.js"
dojo.provide("my.Tree");
dojo.require("dijit.Tree");
dojo.declare("my.Tree", dijit.Tree, {
// class definition
});
X-Domain示例锅炉模块文件"{{modulePath}}/my/Tree.xd.js
dojo._xdResourceLoaded(function(){
return {
depends: [
["provide", "my.Tree"],
["require", "dijit.Tree"]
],
defineResource: function(dojo) {
///////////////////////////////
/// Begin standard declaration
dojo.provide("my.Tree");
dojo.require("dijit.Tree");
dojo.declare("my.Tree", dijit.Tree, {
// class definition
});
/// End standard declaration
///////////////////////////////
}
}
})();