2011-09-07 37 views
3

考慮這個Coffeescript類,在一個應用程序中,每個類都在它自己的文件中。Coffeescript,骨架和加載順序

class Manager extends Person 
    title: titles["manager"] 

如果該文件在「titles」對象之前加載,則會生成錯誤。我假設這是因爲Coffeescripts安全包裝正在執行「.call(this)」這個文件首次加載時?否則,如果我要延遲運行任何代碼,直到整個頁面完全加載($(document.ready())之後,我可以確定所有javascript文件在任何代碼實際運行之前已完全加載。

這難道不是創造一些惱人的加載順序的問題,還是我沒有正確地做什麼?

回答

2

它不能是訂單問題包裝問題。使用立即運行的函數包裝某些東西對訂單沒有影響,只在範圍內。

而如果titles在另一個文件中定義,那麼作用域class Manager的範圍並不重要。所以,這是一個訂單問題。如何定義titles

如果我要延遲運行任何代碼,直到整個頁面完全加載($(document.ready())之後,我可以確定所有javascript文件在任何代碼實際運行之前完全加載。

不太。$(document).ready()(注意括號,沒有document.ready功能......),直到所有頁面的HTML已加載延遲了一個函數的執行,這並不意味着所有的JavaScript已加載。這裏的好消息是:從JavaScript代碼的角度來看,其他JavaScript文件是否已經加載並不重要,因爲它們都是按順序運行的(注:我假設在這裏,你沒有做任何幻想就像從你的JavaScript代碼添加額外的<script>標籤),所以只要你有

<script src="titles.js"></script> 
<script src="Manager.js"></script> 

你可以放心,Manager.js後,才運行。 titles.js有。

警告!依靠$(document).ready()訂購JS代碼是一個常見的錯誤,可能會導致混淆!如果你的HTML看起來像這樣

<script src="Manager.js"></script> 
<script src="titles.js"></script> 

其中titles.js創建了一個名爲全球和titlesManager.js看起來像這樣

$(document).ready -> 
    console.log titles 

則輸出有時titles有時undefined。爲什麼?因爲隨着the docs說,在DOM被初始化後

如果.ready()被調用,新的處理程序傳遞將立即執行。

當第一個JS文件運行時,DOM可能已經被初始化! (實際上,如果瀏覽器將頁面的HTML緩存起來,這往往會發生。)

所以,保持簡單。只需按照正確的順序加載腳本。請記住,出於所有實際目的,您的腳本通過瀏覽器連接在一起,按順序放入單個JS文件中。

+0

哇,謝謝特雷弗。很高興知道沒有魔法,只需要按照正確的順序加載腳本。我在查看DocumentCloud網站的源代碼作爲參考,看起來它們的core.jst文件(帶有全局JST對象)是要加載的最後一個文件。我對前面加載的類如何引用JST對象感到困惑,因爲我在自己的應用程序中發現了這樣的錯誤。 –

0

這確實是一個加載順序問題,並在titlesManager指的是全球在這種情況下,ISN」如果你知道titles是在其他地方聲明的,你必須手動確保腳本已經被首先加載了,是的,問題可能會很好與安全包裝。但只是一個建議:它有一個很好的理由。創建一個名稱空間,而不是導出到全局對象。全局對象位於節點中的this(定義時間)或exports中。我通常把這個只有一行的腳本的頂部應該很容易獲得全局對象:

root = exports ? window 

從那裏我可以把東西放在全局對象,像一個命名空間:

root.app = 
    a: 1, 
    a_fun: -> 1 

class root.app.Cls 
    method: => 1 + 1 

root.app.obj = new root.app.Cls 

現在,全局對象中會有一個「應用」對象,並帶有「類」(可以這麼說)和對象。

2

給一個嘗試CoffeeToaster:
http://github.com/serpentem/coffee-toaster

它會做你提供import指令,這是#<<,即尋找什麼:

#<< foldera/folderb/folderc/myfile 

你不需要通知.coffee擴展名,如果您習慣使用類似於

的選項,您可以打開 packaging選項以使用名稱空間設施

它有一個構建系統,將爲您輸出一個JavaScript文件,或幾個(在調試模式下)以簡化調試過程。

拿上README一看,使用例如在:
https://github.com/serpentem/coffee-toaster/tree/master/usage