我正在尝试从纯JavaScript迁移到Dojo,我遇到了一些问题。我当前的问题是import语句的顺序。在纯JavaScript中我可以有一个A.js
文件
function(name){
this.name=name;
}
文件B.js
就是这样
function(name,age){
this.A=A;
A(name);
this.age=age;
}
然后我可以在index.html
加载这两个文件
<html>
<head>
<script LANGUAGE="javascript" SRC="A.js"></script>
<script LANGUAGE="javascript" SRC="B.js"></script>
</head>
</html>
或
<html>
<head>
<script LANGUAGE="javascript" SRC="B.js"></script>
<script LANGUAGE="javascript" SRC="A.js"></script>
</head>
</html>
但如果我将A.js
和B.js
转换为dojo
dojo.declare("A", null, {
constructor: function(name){
this.name=name;
}
});
等等
dojo.declare("B",[A],
constructor:function(name,age){
this.age=age;
}
});
然后我只能在index.html
中加载脚本
<html>
<head>
<script LANGUAGE="javascript" SRC="A.js"></script>
<script LANGUAGE="javascript" SRC="B.js"></script>
</head>
</html>
如果我尝试在B.js
之前加载A.js
,则会抱怨A.js
不存在。有没有办法解决?
答案 0 :(得分:5)
如果您决定迁移到Dojo,我建议您read about
这个主要的想法是休闲:
您无需使用脚本标记来加载所需的JavaScript文件。
例如:
您有暂停的网站结构:
在您自己的模块中,您可以定义一些类:
“ModuleA”代码:
dojo.provide("Scripts.MyModules.ModuleA");
dojo.declare("A", null, {
constructor: function (name) {
this.name = name;
},
sayName: function () {
alert(this.name);
}
});
“ModuleB”的代码:
dojo.provide("Scripts.MyModules.ModuleB");
dojo.require("Scripts.MyModules.ModuleA");
dojo.declare("B", [A], {
constructor: function (name, age) {
this.age = age;
},
sayName: function () {
alert(this.name + " " + this.age);
}
});
在每个文件的开头,您可以看到以下行:
dojo.provide("Scripts.MyModules.ModuleA");
dojo.provide("Scripts.MyModules.ModuleB");
dojo.provide是Dojo模块系统及其加载器的组成部分。 dojo.provide()告诉加载器已为给定名称提供了a模块。它还为名称创建了一个JavaScript对象。
另外,您可以看到继承自A类的B类。在“ModuleB”中,您应该添加以下行:
dojo.require("Scripts.MyModules.ModuleA");
这意味着“ModuleB”需要“ModuleA”;
最后,在页面上使用此结构的示例:
//连接dojo
...
<script src="Scripts/dojo.js" djconfig="parseOnLoad: true"></script>
...
//如果要创建对象B,则必须在页面上连接ModuleB:
<script type="text/javascript">
dojo.require("Scripts.MyModules.ModuleB");
</script>
//创建对象B
<script type="text/javascript">
dojo.addOnLoad(function () {
var bObject = new B('John',25);
bObject.sayName();
});
</script>
如果使用此结构,您无需关心脚本加载顺序。
P.S。对不起我的“英语”
答案 1 :(得分:1)
您必须在B.js之前加载A.js
“普通代码”和“Dojo”之间的差异在“普通代码”中没有代码执行时加载脚本,但在“Dojo”中加载了B.js脚本后立即执行的dojo.declare()函数(并且,因为B.js中的脚本需要一个类“A”,在“A.js”中声明,“A.js”必须首先加载以创建类“A”)。