2012-04-22 82 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