2009-12-14 64 views
0

我一直試圖使用dojo.require(If)與本地變量動態加載頁面上的模塊基於條件。dojo.requireIf不允許本地變量

 
// note: dojo v1.4 
djConfig = { 
    debugAtAllCosts: true 
}; 

實施例1(不工作)

 
(function() { 
    var nameOfClass = "Two"; 
    dojo.require("my.namespace." + nameOfClass); 
    dojo.addOnLoad(function() { 
    var oneOrTwo = new my.namespace[nameOfClass](); 
    }); 
}()); 

錯誤:的ReferenceError:未定義nameOfClass。

實施例2(不工作)

 
(function() { 
    var nameOfClass = "Two"; 
    dojo.requireIf(nameOfClass == "One", "my.namespace.One"); 
    dojo.requireIf(nameOfClass == "Two", "my.namespace.Two"); 
    dojo.addOnLoad(function() { 
    var oneOrTwo = new my.namespace[nameOfClass](); 
    }); 
}()); 

錯誤:的ReferenceError:未定義nameOfClass。

例3(作品)

 
(function() { 
    window.nameOfClass = "Two"; 
    dojo.requireIf(window.nameOfClass == "One", "my.namespace.One"); 
    dojo.requireIf(window.nameOfClass == "Two", "my.namespace.Two"); 
    dojo.addOnLoad(function() { 
    var oneOrTwo = new my.namespace[nameOfClass](); 
    }); 
}()); 

出於某種原因,它看起來好像需要和requireIf只允許在他們裏面的全局變量。這是目前的侷限性,還是我做錯了什麼?


更新1

因此,如果我理解你(@Maine,@jrburke)正確,這是debugAtAllCosts的限制?如果上述代碼構建爲跨域(添加xd文件前綴/後綴)並執行 - 它將按預期工作?

如果是這種情況,那麼本地測試將作爲跨域執行的代碼的正確方式是什麼,而不進行實際構建?

這也讓我質疑預解析dojo.require(s)的動機。如果loader_xd不會(或者不能)預解析,爲什麼爲測試/調試創建的方法是這樣做的?

更新2

由於在更新1以上沒有與之密切相關的一個兩個問題,我搬到他們出到separate discussion

回答

1

這是因爲requireIf用正則表達式解析爲第一件事,並在正常程序流之前執行。

如果你用grep的requireIf道場源,你會發現這種線的處理它(loader_xd.js):

var depRegExp = /dojo.(require|requireIf|provide|requireAfterIf|platformRequire|requireLocalization)\s*\(([\w\W]*?)\)/mg; 

條件,然後在全球範圍內與eval執行,而不是作爲正常流量的一部分。

1

爲了闡明Main的更多內容,這是Dojo中的XD loader的一個問題。 debugAtAllCosts:true使用XD Loader。如果您只使用沒有debugAtAllCosts的普通Dojo加載器,則不是問題。另外,將模塊模塊名稱作爲屬性附加到公共可見模塊上也可避免此問題。

+0

謝謝@jrburke,但使用普通的dojo加載器將不允許測試代碼的行爲,因爲它將在xd構建之後執行;因爲前者將使用同步xhr來檢索dojo.require [s],而不是使用異步「腳本」(loader_xd)。 – 2009-12-17 15:19:10