2013-12-12 79 views
0

我想製作一種加載器類。試想一下:在requirejs中識別調用模塊

config.js

define(function() { 
    return { 
     appViews : [ 
      'baseViews', 
      'fullDocViews', 
      'docCreateViews', 
      'accountViews', 
      'fullDocViews', 
      'notifyViews' 
     ] 
    } 
} 

loader.js

define(['config', 'underscore'], function (Config, _) { 
    var Loader = {}; 

    _.each(Config.appViews, function (view) { 
     var include = 'views/'+view; 
     Loader[view] = require([include], function (Include) { 
      return Include; 
     }); 
    }); 
    return Loader; 
}); 

fullDocViews.js

define(['loader'], function (Loader) { 
    var moduleView = Loader.baseViews.BaseView.extend({ 
     // Loving life here... 
    }) 
}); 

然而,這將創建一個循環依賴,因爲調用裝載機電話fullDocsView模塊。有沒有什麼辦法,在loader.js中,我可以從產生的視圖散列中排除調用模塊?

所以,我正在尋找的是這樣的:

define(['config', 'underscore'], function (Config, _) { 
    var Loader = {}; 

    _.each(Config.appViews, function (view) { 
     if (view !== callingView) { 
      var include = 'views/'+view; 
      Loader[view] = require([include], function (Include) { 
       return Include; 
      }); 
     } 
    }); 
    return Loader; 
}); 

回答

2

沒有您的代碼中的問題,但它不是循環依賴。這將無法工作:

Loader[view] = require([include], function (Include) { 
    return Include; 
}); 

因爲:

  1. 一個require呼叫這需要依賴的陣列的返回值不是一個模塊。 (它是一個命名localRequire功能,這是require函數的化身之一。)

  2. 用於require呼叫回調的返回值是由RequireJS吞噬。

爲什麼這樣,因爲這樣的要求是異步的。該模塊將在未來的某個不確定時間提供。

有一個require調用返回模塊值:require("module")。您傳遞單個模塊名稱而不是數組。這種呼叫要麼返回一個模塊,如果它是已經加載,或者立即失敗。

至於循環依賴,我不相信RequireJS暴露了什麼模塊導致另一個模塊加載的名稱。它的方式handles circular dependencies是,如果A需要B需要A,那麼B必須準備好接受,當它被實例化時,它爲A得到的值將是undefined。之後它可以再次要求A,並獲得真正的價值。

+0

非常感謝您的迴應。 Node有module.parent,它似乎在require.js中做我正在尋找的東西 – starsinmypockets