首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dojo类加载顺序

Dojo类加载顺序
EN

Stack Overflow用户
提问于 2011-04-08 17:24:20
回答 2查看 1.5K关注 0票数 1

我正在尝试从纯javascript迁移到Dojo,但遇到了一些问题。我现在的问题是import语句的顺序。在纯javascript中,我可以有一个这样的文件A.js

代码语言:javascript
复制
function(name){
    this.name=name;
}

以及这样的文件B.js

代码语言:javascript
复制
function(name,age){
    this.A=A;
    A(name);
    this.age=age;
}

然后我可以在index.html中加载这两个文件

代码语言:javascript
复制
<html>
    <head>
    <script LANGUAGE="javascript" SRC="A.js"></script>
    <script LANGUAGE="javascript" SRC="B.js"></script>
    </head>
</html>

或as

代码语言:javascript
复制
<html>
    <head>
    <script LANGUAGE="javascript" SRC="B.js"></script>
    <script LANGUAGE="javascript" SRC="A.js"></script>
    </head>
</html>

但是如果我将A.jsB.js转换成dojo

代码语言:javascript
复制
dojo.declare("A", null, {
    constructor: function(name){
        this.name=name;
    }
});

诸如此类

代码语言:javascript
复制
dojo.declare("B",[A],
    constructor:function(name,age){
        this.age=age;
    }
});

然后,我只能这样加载index.html中的脚本

代码语言:javascript
复制
<html>
    <head>
    <script LANGUAGE="javascript" SRC="A.js"></script>
    <script LANGUAGE="javascript" SRC="B.js"></script>
    </head>
</html>

如果我尝试在A.js之前加载B.js,它会报告A.js不存在。有没有什么办法解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-08 17:37:17

必须始终在B.js之前加载A.js

您的“普通javascript代码”和"Dojo“之间的区别在于:在”普通代码“中,脚本加载时不执行代码,而在"Dojo”dojo.declare()函数中,脚本加载后立即执行(而且,因为B.js中的脚本需要类"A",所以必须先加载"A.js“中声明的"A.js",才能创建类"A")。

票数 1
EN

Stack Overflow用户

发布于 2011-04-08 18:55:50

如果您决定迁移到Dojo,我建议您使用read about

  1. dojo.provide()
  2. dojo.require()
  3. dojo.declare()

其主要思想是:

加载所需的JavaScript文件时不需要使用脚本标记。

例如:

你有一个休眠的网站结构:

您可以添加"dojo.js“文件并将其放入”“文件夹中,您可以创建文件夹"MyModules”

  • ...

  • 您可以创建两个自己的模块"ModuleA“和"ModuleB"

在您自己的模块中,您可以定义一些类:

ModuleA的代码:

代码语言:javascript
复制
dojo.provide("Scripts.MyModules.ModuleA");

dojo.declare("A", null, {
    constructor: function (name) {
        this.name = name;
    },

    sayName: function () {
        alert(this.name);
    }
});

ModuleB的代码:

代码语言:javascript
复制
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);
    }
});

在每个文件的开头,您可以看到行:

代码语言:javascript
复制
dojo.provide("Scripts.MyModules.ModuleA");
dojo.provide("Scripts.MyModules.ModuleB");

dojo.provide是Dojo模块系统及其加载器不可或缺的一部分。dojo.provide()告诉加载程序已经为给定的名称提供了一个模块。它还会为该名称创建一个JavaScript对象。

同样,正如您可以看到的,类B继承自类A。在本例中,您应该在"ModuleB“中添加以下行:

代码语言:javascript
复制
dojo.require("Scripts.MyModules.ModuleA");

表示“ModuleB”需要"ModuleA“;

最后,页面上使用此结构的示例如下:

//连接dojo

代码语言:javascript
复制
...
<script src="Scripts/dojo.js" djconfig="parseOnLoad: true"></script>
...

//如果要创建对象B,则必须连接第页的ModuleB:

代码语言:javascript
复制
<script type="text/javascript">
dojo.require("Scripts.MyModules.ModuleB");
</script>

//创建object B

代码语言:javascript
复制
<script type="text/javascript">
    dojo.addOnLoad(function () {
      var bObject = new B('John',25);
        bObject.sayName();
    });
</script>

如果使用这个结构,你不需要关心脚本的加载顺序。

另外,对不起,我的“英语”

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5593101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档