2013-10-27 91 views
2

升級到2.2後,我無法讓requirejs像以前一樣工作。play 2.2 webjars requirejs jquery integration

在我看來,requirejs沒有被初始化或配置不正確。我試圖按照https://github.com/mariussoutier/play-angular-require-seed,但我甚至不能讓最簡單的情況下工作。

jquery可以在main.js中正確定位,但需要(['jquery'] .....)在標記中不起作用。

如果有人可以幫助我,這將不勝感激。

webjars定義

libraryDependencies ++= Seq(
    javaJdbc, 
    javaEbean, 
    cache, 
    "org.webjars" % "jquery" % "1.10.2", 
    "org.webjars" % "requirejs" % "2.1.1", 
    "org.webjars" % "webjars-play_2.10" % "2.2.0" 
)  

resolvers += "typesafe" at "http://repo.typesafe.com/typesafe/repo" 

requireJs += "main.js" 

requireJsShim += "main.js" 

main.js

(function(requirejs) { 
     "use strict"; 

     // -- PROD RequireJS config -- 
     requirejs.config({ 
     shim: { 
      "jquery": { exports: "$" } 
     }, 
     paths: { 
      "jquery": ["/webjars/jquery/1.10.2/jquery.min"] 
     } 
     }); 
     // It works fine here   
     require(["jquery"], function($) { 
     console.log($); 
     }); 
    })(requirejs); 

index.scala.html

@(title: String) 

<html> 
    <body> 
    <script src='/lib/require.js' type='text/javascript' data-main="/assets/javascripts/main"></script> 
    <script type="text/javascript"> 
     require(["jquery"], function($) { 
      console.log($); 
      }); 
    </script> 
    </body> 
</html> 

main.js被加載,並在控制檯的錯誤消息是

Uncaught TypeError: Property 'require' of object [object Object] is not a function 

編輯 這裏的關鍵是瞭解AMD的概念。雖然標籤中的兩個片段依次放置,但不能保證按順序執行。因此,當第二個代碼片段運行時,requirejs可能尚未配置。

<script src='webjars/requirejs/2.1.8/require.js' type='text/javascript' data-main="javascripts/main"></script> 
<script type='text/javascript'> 
    // Second snippet 
    require(['jquery'], function($) {return $;}); 
</script> 

爲了解決這個問題,我們有兩種不同的方法:

  1. 包括在main.js第二代碼段(在數據主指定)的JavaScript代碼和使用要求([「依賴」 ],function(){// do second.js})
  2. 包含requirejs時不要指定data-main字段,並在第二部分中執行所有配置。

恕我直言,第一種方法是優選的,是確切的一個示例項目https://github.com/mariussoutier/play-angular-require-seed

回答

0

使用排位賽我的回覆,絕對不是專家...

在你index.scala.html頁面,您正試圖使用​​異步加載的腳本。這會給你隨機的結果,因爲它可能不能及時加載。

從RequireJS網站:

注:腳本標籤 require.js生成您的數據主要模塊包括異步 屬性。這意味着,您不能假定數據主腳本的加載和執行將在稍後在同一頁面中引用的其他腳本 之前完成。

例如,當 需要時,這種安排將隨機失敗。對於「富」模塊配置路徑尚未設置 存在需要()倒是在它之前之後:

<script data-main="scripts/main" src="scripts/require.js"></script> 
<script src="scripts/other.js"></script> 

// contents of main.js: 
require.config({ 
    paths: { 
     foo: 'libs/foo-1.1.3' 
    } 
}); 

// contents of other.js: 

// This code might be called before the require.config() in main.js 
// has executed. When that happens, require.js will attempt to 
// load 'scripts/foo.js' instead of 'scripts/libs/foo-1.1.3.js' 
require(['foo'], function(foo) { 

}); 

另外值得注意......你掛例子,就可以避免這個問題,因爲「require」的所有用法都發生在main * .js中

所以我相信你需要做的是將第二個腳本中包含的JavaScript代碼包裝在一個事件處理程序中, window.onload或DOMContentLoaded事件,以延遲執行,直到這些事件已經被觸發(並且所有事件都將存在且正確)。

參考文獻:

+0

非常感謝您的澄清。我認爲require(['jquery'],...)中的所有依賴項將通過指定data-main加載,然後我可以在第二個