2014-02-18 32 views
2

我正在使用最新的qooxdoo SDK(3.5),並試圖找到動態加載模塊的方法。每個模塊都會實現一個「init」函數,該函數在應用程序中創建一個窗口,並且從這一點開始,它是自包含的。有誰知道動態加載qooxdoo模塊的方法嗎?

我需要的是能夠在不知道模塊事先存在的情況下調用任意的init函數。例如,某人上傳自定義模塊並嘗試運行它 - 我只需要調用模塊的init函數(或者如果調用失敗,則返回錯誤)。

任何想法?

編輯:

喜歡的東西:

function loadModule(modName) { 
    var mod = new qx.something.loadModule(modName); 
    mod.init(); 
} 
+0

你怎麼想_detect_,它的上傳? – abarnert

+0

無所謂,如果它不在那裏,我只是顯示一個錯誤。 – jpreed00

+0

我不清楚你想要做什麼。你想接受一個新的模塊,然後立即動態加載它?或者你想要某種插件機制,人們可以上傳新的插件,每次你的應用程序啓動時,所有這些插件都會被加載?或者有些不同? – abarnert

回答

3

我發現Qooxdoo必須運行動​​態代碼的3種方式。第一種方法是通過內置的零件裝載機。 「零件」,基本上是將的Qooxdoo加載「剛好及時」當你真正需要它們的應用程序的部分 - 例如,工作中很少使用的表單或對話框類。這種方法並不是真正動態的(在我看來),因爲它要求代碼被包含在Qooxdoo提供的構建過程中。解釋它的工作原理不在這個答案的範圍之內,坦率地說,我自己還不是那麼熟悉它。

第二種方式是通過qx.Class.getByName()函數調用。它的工作方式如下:

qx.Class.define("Bacon", { 
    extend: qx.core.Object, 
    construct: function(foo, bar) { 
    this.foo = foo; 
    this.bar = bar; 
    } 
}); 

var klass = qx.Class.getByName("Bacon"); 
var obj = new klass("foo", "bar"); 
this.debug(obj.foo); 

此方法在Qooxdoo郵件列表here上找到。此方法適用於包含在構建過​​程中的代碼代碼動態地推出,但在我看來,是由原因很簡單,如果你是動態引入一個新的類,你將不得不使用第三種方法莫須有工作無論如何,第三種方法。

的最後一個方法我所在其實是通過研究源代碼,Qooxdoo playground向我透露。 (源代碼可以在桌面下載的一部分。)

操場從編輯器讀取代碼,並創建一個匿名函數出來,然後執行相應的功能。有一堆設置和拆除遊樂場圍繞下面的代碼,但爲了簡潔和清晰,我已經將它刪除。如果您有興趣自己做類似的事情,我強烈建議查看遊樂場應用程序的源代碼。動態代碼執行包含在810行開始的__updatePlayground函數中(Qooxdoo v3.5)。

var fun; 
try { 
    fun = qx.event.GlobalError.observeMethod(new Function(code)); 
} catch(ex) { 
    //do something with the exception 
} 

try { 
    fun.call(); 
} catch(ex) { 
    //do something with the exception 
} 

的代碼很簡單,使用built-in Javascript function「呼」地執行匿名函數。

0

請定義模塊。

Qooxdoo源代碼使用與Java相同的約定 - 每個文件一個類。你真的想單獨加載類並處理依賴關係嗎?如果不是,你對模塊的定義是什麼?

除此之外,qooxdoo還有一個包的概念,它是一組類,接口和mixins,框架,contribs,包括框架本身,由生成器以優化方式打包,以便早期使用的類是加載較早。使用qooxdoo自己的打包機制不需要比使用自定義參數運行構建或定製config.json更多的努力 - 所有這些在手冊中都有詳細介紹。

如果你對某個模塊的想法是某種子應用程序,其中大部分與大型應用程序中的所有其他應用程序都是分離的,但我不確定在沒有顯着修改生成器代碼的情況下可以實現這一點(使用./generate.py調用)或接受一些大小的開銷。

我不會詳細介紹修改發生器 - 如果你走這條路,你需要深入挖掘,你會學到的東西比我對發生器的瞭解還要多。

你可以在qooxdoo允許的範圍內做什麼,就是爲每個模塊創建一個單獨的島應用程序,通過附加到頂部窗口的JavaScript爲模塊間通信建立自己的基礎架構,並在主頁面內運行模塊,還有一些手動添加的魔術,使得各個模塊的行爲類似於選項卡窗格或qooxdoo窗口。除了一些尷尬的定製非qooxdoo代碼之外,您必須花費的開銷是所有模塊都將重新加載qooxdoo框架代碼。