Dojo类加载顺序

时间:2011-04-08 09:24:20

标签: javascript dojo

我正在尝试从纯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.jsB.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不存在。有没有办法解决?

2 个答案:

答案 0 :(得分:5)

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

  1. dojo.provide()
  2. dojo.require()
  3. dojo.declare()
  4. 这个主要的想法是休闲:

    您无需使用脚本标记来加载所需的JavaScript文件。

    例如:

    您有暂停的网站结构:

    enter image description here

    1. 添加“dojo.js”文件并将其放入“脚本”文件夹
    2. 您创建文件夹“MyModules”和...
    3. 您创建了2个自己的模块“ModuleA”和“ModuleB”
    4. 在您自己的模块中,您可以定义一些类:

      “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”)。