2014-02-26 49 views
0

我會適當幫助您使用JavaScript創建我的庫並使用Dojo。 在我看來,像一個初學者的問題,但我似乎無法找到問題。在JavaScript/Dojo中構建我的庫

我想創建一個名爲 'EDM'

的EDM.js庫是非常簡單的:

define([ 
    "dojo/_base/declare" 

], function(declare) { 


    var EDM = declare("EDM", { 

     constructor: function() { 
      console.log("Hi EDM lib") 
     }, 

     sayHi: function() { 
      console.log("Hi EDM lib") 
     } 
    }); 

    edm = new EDM(); 
    return edm; 
}); 

中的index.html加載它:

​​

和main.js使用EDM是:

var newObject = edm; 

的想法基本上是可以使用EDM作爲前綴在EDM.js文件的功能。

然而,裝載index.htm文件時,我得到這個錯誤:「未捕獲的ReferenceError:EDM沒有定義」

我會適當的任何指示。

謝謝

回答

1

您應該使用Dojo AMD加載程序代替自己加載文件。刪除以下<script>標籤:

<script src="../src/EDM.js" type="text/javascript"></script> 

然後寫了下面的代碼在main.js

require([ "../src/EDM" ], function(edm) { 
    var newObject = edm; 
}); 

做這種方式的優點是:

  • 無需添加<script>加載時減慢頁面速度的標籤
  • 沒有其他對象添加到gl obal scope

當然,因爲全局範圍內沒有對象,所以不能直接檢索edm對象。這就是爲什麼你得到那ReferenceError


要回答你的問題,從評論:是和否。事實上,你已經在EDM.js添加edm全球範圍,因爲你沒有把var在下面的語句前面:

edm = new EDM(); 

但是,只執行了define()回調,如果它被稱爲來自Dojo AMD loader的require()函數。所以這實際上意味着您必須首先加載AMD模塊,然後才能從全球範圍訪問edm

所以你的情況,下面的工作還有:

require([ "../src/EDM" ], function(bla) { 
    var newObject = edm; 
}); 

正如你可以在上面的例子中看到,我們調用模塊bla,但是,因爲你在EDM.js其添加到全球範圍內,它現在可用。但是,爲了將其添加到全局範圍,您必須正確加載模塊。

但要小心,向全局範圍添加對象通常是不鼓勵的,因爲它們可以從任何代碼中操作,這使得它很難調試。全局變量不是一個好主意還有很多其他的原因,你可以在網上找到更多關於它的信息。

+0

謝謝迪米特里,這種方法正在工作。我還有一個問題,是否有可能以某種方式在控制檯(例如鉻)中訪問edm對象?也許我可以在EDM.js中創建一個全局對象來展示edm對象? – user1197547

+0

是且不是,您實際上已經將它添加到'EDM.js'中的全局作用域中,但只有在您從AMD加載器調用它時纔會執行。更詳細的解釋可以在我的答案中找到。 – g00glen00b