2013-11-15 141 views
3

我目前是RequireJS的初學者,我對AMD的概念有點麻煩,特別是RequireJS定義它的方式。RequireJS - 動態加載模塊

我的目標是構建一個智能加載程序,調用他需要的特定解析器。


總結我的需求:

(A)創建我裝載機:新的Loader(

(B)表示加載數據。這是一個簡單的字符串。 (C)創建加載器對象。它執行一些算法來決定什麼是最好的Parser使用。最終,它從遠程位置下載解析器。最後,它動態地加載解析器。


我的問題是這樣的:我怎麼能加載一個模塊/插件而不用在定義中說明它?我不能在define([theParserHere])中設置它,因爲我無法知道需要哪個解析器。

回答

2

require函數聽起來像它可以用於您的目的。它允許加載模塊,但不能定義新的模塊。

您的裝載機可以調用的函數,例如在需要時以下動態加載模塊:

function loadParser(name, fn) { 
    require(["parsers/" + name], fn); 
} 

name將是解析器的名稱或路徑或東西(注意,我的路只是一個例如)和fn是加載完成後調用的回調函數。函數的第一個參數是加載的模塊。

此功能可以被放置在您的裝載機對象或只是坐在裏面的定義:

define(function() { 

    function Loader(text) { 
     this.text = text; 

     this.parser = null; 
     this.loadParser(); 
    } 

    Loader.prototype.loadParser = function() { 
     var self = this; 
     var parserName = this.getParserName(); 
     require(["parsers/" + parserName], function (Parser) { 
      self.parser = Parser; 
      self.parse(); 
     }); 
    } 

    Loader.prototype.getParserName = function() { 
     //mystery logic to determine language... 
     return "some-parser-name"; 
    } 

    Loader.prototype.parse = function() { 
     if (!this.parser) { 
      throw "No parser loaded"; 
     } 
     //do your parsing logic... 
    } 

    return Loader; 

}); 

現在,如果我真的這樣做了,我會用Q或jQuery的deferreds或東西內解決解析器回調函數,而不是所有那些函數調用。

+0

感謝您的回答。 JQuery Deffered幫助我解決我的問題:) –