2014-02-24 18 views
1

我正在使用RequireJSRequireJS如何決定要運行什麼以及要加載什麼?

一個EmberJS應用在我的routes.coffee文件,我定義我的路由:

define ['jquery' 
     'ember' 
     '_' 
     'cs!myapp/myapp' 
     "cs!myapp/routes/index_route" 
     ], ($, Ember, _, MyApp, IndexRoute) -> 
    alert "Inside myapp route" 
    MyApp.Router.map() -> 
     @resource "play", path: '/play',() -> 
      @resource "myapp", {},() -> 
       @resource "games", {},() -> 
        @route "next" 
        @resource "frames", {},() -> 
         @route "commercial" 
        @resource "trivia", {},() -> 
         @route "commercial" 
       @route "start" 
       @route "howItWorks" 
       @route "goodbye" 
     @route "readyToStart" 
     @route "noContent" 

    MyApp.IndexRoute = IndexRoute 

具體來說,我的理解是,這是一個define不是require,所以它不該不執行該代碼。但警報消失。那麼發生了什麼?

回答

2

確實您在回答中顯示的define不會立即調用您提供給它的工廠功能。 (工廠功能是您對define的回撥。)但是,routes.coffee中的alert將在需要routes.coffee時直接或間接地被調用。如果routes.coffee模塊出現在require呼叫或define呼叫的相關性列表中,則該模塊是必需的。

請注意,有可能需要一個模塊而不使用它。 RequireJS不在乎模塊是否使用或不。它只關心一個模塊是必需的。因此,如require(['foo'])這樣的呼叫將需要模塊foo,並導致其工廠功能被調用,即使它不是在此require調用中使用

+0

我的'routes.coffee'用在'main.coffee'的'define'中,那麼這意味着它只是在'define'中運行? – Shamoon

+0

是的。當RequireJS加載'main.coffee'時,它會讀取傳遞給'define'調用的依賴項列表,該列表包含'routes.coffee',因此會加載'routes.coffee',這會導致其工廠函數被調用和「提醒」。然而,它不是'routes.coffee'中的'define'調用,它會導致自己的工廠函數被執行。一個'define'的工廠函數總是由*另一個*'define'或一個'require'調用來執行。 – Louis

相關問題