2012-01-08 30 views
34

有沒有人在RequireJS和Ember.js上有過很多成功?看到Ember喜歡將其結構分配給一個全局對象,我發現它可以真正與Requirej對接。對於Ember,LAB.js會更好嗎?Ember.js和RequireJS

+0

我還發現requirejs很難與其他庫一起使用,反之亦然。這就是爲什麼我創建了一個使用起來更容易,並且使用角度進行測試的庫。在底部有一個演示應用程序:gngeorgiev.github.io/Modulerr.js您也可以將所有腳本合併爲一個,而不依賴於Modulerr.js – 2014-08-10 21:30:12

回答

31

編輯(2012-01-30):我在bitbucket上的repo中推出了一個更完整的例子。

我已成功使用RequireJS加載Ember.js以及日期時間插件(github)。 Ember命名空間本身保持全局,但我所有的應用程序數據,包括我的Ember.Application實例,都通過RequireJS保存在模塊中。我還使用'text!'加載了句柄模板插入。

我還沒有任何問題,但這不是一個完整的應用程序,更多的是一個概念證明。以下是我的工作方式。我可以直接使用Safari加載我的應用程序,而不需要服務器。您仍然需要一臺服務器才能使用Chrome加載該服務器,該服務器不允許JavaScript從文件系統加載文件。

1)因爲Ember.js使用BPM/Spade,所以我無法使用repo的克隆。相反,我的包裹編譯版本模塊中:

的lib/ember.js

define(['jquery', 
     'plugins/order!lib/ember-0.9.3.js', 
     'plugins/order!lib/ember-datetime.js'], 
     function() { 
      return Ember; 
}); 

注意,這本身並沒有從全球範圍隱藏灰燼。但是我正在設置一些東西,所以如果將來我可以隱藏它,那麼依賴於這個模塊的其他模塊仍然可以按原樣工作。

2)模塊可以參考灰燼像這樣:

應用程序/ core.js

define(['lib/ember'], function(Em) { 
    MyApp = Em.Application.create({ 
     VERSION: "0.0.1" 
    }); 
    return MyApp; 
}); 

這裏, 「EM」 也可以命名爲別的東西;它並不直接指向全局變量,而是來自lib/ember.js中定義的模塊。

3)要由灰燼訪問,車把必須註冊:

應用/模板/我-template.handlebars

MyApp v{{MyApp.VERSION}}. 

應用程序/視圖/我的 - view.js

define(['lib/ember', 
     'plugins/text!app/templates/my-template.handlebars'], 
     function(Em, myTemplateSource) { 

      Em.TEMPLATES["my-template"] = Em.Handlebars.compile(myTemplateSource); 

      var myView = Em.View.create({ 
       templateName: "my-template"; 
      }); 

      return myView; 
}); 

4)我正在使用require-jquery.js(jQuery和RequireJS捆綁在一起)。

+0

當您遵循您的方法時,出現此錯誤: 錯誤:模塊名稱'ember 「運行時間」尚未加載上下文:_你有任何想法如何解決?我出來的想法:) – 2012-01-18 09:07:06

+0

也許你有一個公共回購,我可以看看你的樣本?這將是方便! – 2012-01-18 09:26:55

+0

@ claude-precourt由於您未使用var關鍵字,因此它看起來像MyApp被聲明爲全局變量。你確定這個工作也沒有使用全局上下文嗎? – 2012-01-19 08:04:10

8

有一個更好的方法來包含一個可以有多個模板塊的句柄文件。它可以在一個包括編譯和可用。

用於例如:您有以下把手模板文件:

../templates/sample.handlebars

<div><!-- just a filler html tag. Wont show up in your page --> 
    <script type="text/x-handlebars" data-template-name="template1"> 
     Some Html or Template Content ... 
    </script> 
    <script type="text/x-handlebars" data-template-name="template2"> 
     Some Html or Template Content ... 
    </script> 
    <script type="text/x-handlebars" data-template-name="template3"> 
     Some Html or Template Content ... 
    </script> 
</div> 

../views/sampleView.js

define([ 
    'jquery', 
    'lib/ember', 
    'plugins/text!../templates/sample.handlebars'], 
    function($, Em, myTemplateSource) { 

     // Bootstrap method accepts a context element under which all handlebars 
     // template blocks are defined. The filler <div> in this case. 
     // Compiles and assigns to the EM.TEMPLATES hash correctly. 
     Em.Handlebars.bootstrap($(myTemplateSource)); 

     var myView = Em.View.create({ 
      templateName: "template1"; 
     }); 

     return myView; 
}); 
+1

非常優雅。使用requireJS作爲Ember的「最佳實踐」,或者更多的方式來組織大型項目?我真的在尋找一種方法來構建我的項目,但我有一個不好的感覺,就是讓代理一直預加載所有的東西。另一方面,這樣更清楚。 – nembleton 2012-10-28 10:14:31