2012-04-22 81 views
6

我在Javascript編程已經有一段延長的命名空間。最近我做了一個相當龐大的jQuery項目和這美妙的文章中描述的應用模塊模式:http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth如何使用EmberJS

這一切都很好,很正常,並且代碼看起來光滑和管理的,但我覺得還可以更好。我已經花一天時間尋找一些JavaScript框架,主要是那些:

  • 有無UI綁定支持
  • 有一個模板系統
  • 可以用jQuery工作
  • 幫我安排我的代碼在類似的方式,我有我整個框架跌跌撞撞像AngularJS,KnockOutJS,SpineJS,JavascriptMVC,等等。一個真正貼出來的模塊模式

一樣 - 並稱贊相當 - 爲EmberJS。

我決定給它一個鏡頭,但它並不容易。 EmberJS教程的可用性非常有限。經過很長時間的努力,我設法讓一些東西運行,我喜歡EmberJS做的事情!只有一件事我無法弄清楚 - 這也是我的問題:如何擴展Ember命名空間(使用Ember.Application.create製作)?

澄清:我的項目的舊版本有一個核心命名空間和一個Util命名空間。兩者都包含其他所有類別可以使用的各自的功能。我如何在初始命名空間的頂部使用帶有函數的Core-和Util-命名空間?

難道我只是做:

MyNamespace = Ember.Application.create(); 
MyNamespace.Core = Ember.Application.create(); 
MyNamespace.Util = Ember.Application.create(); 

還是別的什麼?

回答

10

您不能嵌套Ember.Namespace(其中Ember.ApplicationEmber.Namespace的子類),請參閱問題#683

聖多美戴爾的核心貢獻者之一,增加了有關的複雜的應用佈局一個有趣的回答,請參閱comment

所以,你可以只用App = Ember.Application.create()這個命名空間下創建你自己的控制器,視圖等。或者你可以 - 如果你打算重用在其他項目/應用的一些代碼 - 拆分命名空間的是這樣的:

Util = Ember.Namespace.create({ 
    importantNames: 'Einstein'.w() 
}); 

Core = Ember.Namespace.create({ 
    sqrt: function(x) { return Math.sqrt(x); } 
}); 

App = Ember.Application.create(); 

... 

App.myListController = Ember.Object.create({ 
    importantNamesBinding: 'Core.importantNames', 
    sqrtBinding: 'Util.sqrt' 
}); 

Ember.Application延伸Ember.Namespace,並增加了有關處理事件的功能(點擊......)。當你寫一個享有申請這個東西是有用的 - 在你的CoreUtil命名空間,你就不需要的東西,這就是爲什麼這是只是Ember.Namespace

+0

首先,感謝您的回覆迅速,非常詳細。其次,我並不介意非嵌套命名空間,我僅僅是尋找正確的函數調用來創建一個名爲Ember.Namespace.Create的命名空間對象!如果有的話,我可以使用我的模塊模式方法來使Ember應用程序的名稱空間(無論嵌套或不嵌套),但這只是骯髒。 – 2012-04-22 20:54:06

+0

剛試過之後,我發現嵌套命名空間實際上可以工作。由於受歡迎的需求,它可能在最近的版本中發生了變化? – 2012-04-23 09:02:08