2011-04-08 41 views
1

我試圖從純JavaScript遷移到Dojo,並且遇到了一些問題。我目前的問題是按照導入語句的順序。在純JavaScript我能有一個文件A.js這樣Dojo類加載順序

function(name){ 
    this.name=name; 
} 

正因爲如此

function(name,age){ 
    this.A=A; 
    A(name); 
    this.age=age; 
} 

文件B.js,然後我可以在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.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 10,它會抱怨A.js不存在。有沒有辦法解決?

+0

真的嗎?我正在使用動畫功能和繼承結構的Dojo b/c ... do tell – puk 2011-04-08 09:46:30

+0

我無法忍受那個可怕的'$'符號。我發現它像在Python簽名的每個對象參數列表中傳遞的'this'一樣煩人。 – puk 2011-04-08 10:10:57

+0

puk,這兩款工具包都非常出色,每款都有自己的風格,並且深度不同。 – peller 2011-04-09 14:20:58

回答

1

你必須始終B.js

之前

你的「純JavaScript代碼」,在什麼「明碼」沒有劇本時加載執行的代碼,但在「道場「道場」之間的差分負荷A.js 「加載B.js腳本後立即執行dojo.declare()函數(並且,因爲B.js中的腳本需要」A.js「中聲明的類」A「,所以必須先加載」A.js「用於創建類「A」)。

+0

有無論如何告訴腳本加載其他腳本?只要沒有循環,就像Python一樣,一切都是公平的遊戲?例如,具有以下鏈接的腳本 index.html-> C.js-> B.js-> A.js index.html-> B.js-> A.js index.html-> A.js ?? – puk 2011-04-08 09:41:37

+0

看到[dojo.require](http://dojotoolkit.org/api/dojo/require) – peller 2011-04-09 14:18:02

+0

我不認爲dojo.require是這樣工作的。它仍然要求它試圖加載的類已經被創建。我可以理解爲什麼,這是因爲它們在腳本和dojo名稱之間沒有關聯。所以scripts/test.js可以有一個類person(),它被提供給dojo作爲'someone'。基本上dojo不知道腳本的位置 – puk 2011-04-10 01:43:30

5

,如果你決定遷移到道場,我建議你read about

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

其主要思想是休耕:

您不需要使用腳本標籤f或加載所需的JavaScript文件。

例如:

你必須休耕網站結構:

enter image description here

  1. 你加 「的dojo.js」 文件,並把它放在 「腳本」 文件夾
  2. 你創建文件夾「MyModules」和...
  3. 你創建2個自己的模塊 「ModuleA」 和 「ModuleB」

在自己的模塊定義一些類:

代碼 「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()告訴加載器已經爲給定的名稱提供了一個模塊。它還爲該名稱創建一個JavaScript對象。

而且你可以看到B類從A級繼承在這種情況下,「ModuleB」你應該加入這一行:

dojo.require("Scripts.MyModules.ModuleA"); 

這意味着,「ModuleA」需要「ModuleB」;

和慣例的結尾,例如此結構在頁面上:

//連接道場

... 
<script src="Scripts/dojo.js" djconfig="parseOnLoad: true"></script> 
... 

//如果你想創建你必須頁上的連接ModuleB對象B:

<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.對不起,我的「英文」