如何使用EmberJS扩展名称空间

时间:2012-04-22 19:53:31

标签: javascript jquery model-view-controller ember.js

我已经在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。两者都包含其所有其他类可以使用的各自的功能。如何在初始命名空间之上使用具有函数的Core-和Util-命名空间?

我只是这样做:

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

还是其他什么?

1 个答案:

答案 0 :(得分:10)

您无法嵌套Ember.NamespaceEmber.Application作为Ember.Namespace的子类),请参阅问题#683

Tome Dale是核心贡献者之一,他提供了一个关于复杂应用程序布局的有趣答案,请参阅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命名空间中,您不需要这些内容,这就是为什么只是 {{1 }}