如何使用EmberJS扩展名称空间

我已经用Javascript编程了一段时间。 最近我制作了一个非常庞大的jQuery项目并应用了这篇精彩文章中描述的模块模式: http : //www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

这一切都很好,花花公子,代码看起来很光滑,易于管理,但我觉得它可能会更好。 我花了一天时间寻找一些Javascript框架,主要是:

  • 拥有UI绑定支持
  • 有一个模板系统
  • 可以使用jQuery
  • 帮助我以与模块模式类似的方式组织我的代码

我偶然发现了像AngularJS,KnockOutJS,SpineJS,JavascriptMVC等框架。真正引人注目的 – 并且备受赞誉的是EmberJS。

我决定试一试,但这并不容易。 EmberJS教程的可用性非常有限。 经过很长一段时间的努力,我设法让一些东西运转起来,我喜欢EmberJS的作品! 只有一件事我似乎无法弄明白 – 这也是我的问题: 如何扩展Ember命名空间(使用Ember.Application.create制作)?

为了澄清:我的项目的旧版本有一个Core-namespace和一个Util-namespace。 两者都包含其所有其他类可以使用的各自的function。 如何在初始命名空间之上使用具有函数的Core-和Util-命名空间?

我只是这样做:

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

或者是其他东西?

你不能嵌套Ember.Namespace (其中Ember.ApplicationEmber.Application的子类),见问题#683 。

作为核心贡献者之一的Tome Dale为复杂应用程序的布局添加了一个有趣的答案,请参阅评论 。

因此,您可以使用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 ,并添加了有关处理事件的function(单击,…)。 当您使用视图编写应用程序时,这个东西很有用 – 在您的CoreUtil命名空间中,您不需要那些东西,这就是为什么这只是一个Ember.Namespace