2013-11-02 48 views
2

我使用預編譯的客戶端應用程序,這些應用程序都是用我需要擴展的Dojo 1.8(AMD樣式)編寫的。Dojo:覆蓋預裝的模塊

我有權訪問源代碼,但希望在可能的地方使其保持不變,而是傾向覆蓋(這就是應用程序插件框架的工作原理,其他任何東西都是黑客)。

我的腳本只在基本應用程序腳本之後加載。例如,我不能修改djConfig,也不能在加載基本應用程序模塊之前發生其他任何事情。

這是我的問題:我想擴展其中一個基本應用程序類(使用declare創建),並在全局範圍內應用我的覆蓋 - 即使在已經需要包含此類的模塊的預加載模塊上(但尚未實例化它)。

到目前爲止,我發現的最佳解決方案是使用require()來爲包含類的模塊別名。但是,這隻適用於我可以註冊別名後需要該類的模塊。

+2

最好的辦法是隻覆蓋的原型您要編輯的模塊。您可以直接使用原型或使用dojo.extend來完成此操作。另外看起來「道場猴修補」 – tik27

回答

3

Dojo AMD Loader documentation狀態:

一旦模塊值已進入模塊命名空間,它是 在每次需要的時間不重新計算。在實際的水平上,這個 意味着工廠只被調用一次,並且返回的值是 在使用給定模塊的所有代碼中被緩存和共享。 (注: 道場裝載機包括非標準功能require.undef,這 取消定義模塊值)

這意味着,如果修改了模塊的原型,這種變化將在整個應用程序傳播,甚至到更改之前創建的實例,因爲這是JavaScript的工作原理。

要修改原型通過dojo/_base/declare創建的類,有在構造函數中定義的extend()方法:

require(['App'], function(App) { 
    App.extend({ 
     run: function() { 
      // override `run` method here   
     } 
    }); 
}); 

看到它在行動:http://jsfiddle.net/phusick/HxkFs/

+1

這正是我正在尋找。非常感謝! –