我可以在ember中编写助手以避免代码重复

时间:2014-09-22 16:49:00

标签: javascript ember.js

我有几行重复的代码

Ember.$(".close").trigger('click'); window.parent.showRegister();

in:adapterscontrollersroutes

编写帮助(函数或操作)并在不同位置执行此操作的最佳位置。

例如,我可以在controller中编写函数,但我不知道controllers中访问RESTAdapter的方式。

2 个答案:

答案 0 :(得分:1)

您可以或不能从另一个访问某些抽象的主要原因是控制软件复杂性,尝试将其保持在最低限度。遵循SOLIDlow coupling / high cohesion等原则可以帮助我们维护复杂的软件系统,提高系统的可理解性并减少开发过程中出错的可能性。 / p>

Ember以某种方式遵循MVC模式,因此我不建议(1)在控制器/适配器/路由器中保留DOM操作的代码,以及(2)耦合适配器,控制器并以这种方式路线。我确信有一种方法可以将此代码放在View或Ember.App类之外的模块中;或者设置处理这种情况的路由映射。

如果情况并非如此,或者您需要一个简单直接的解决方案,您可以使用丑陋的魔法结构来访问Ember中的任何地方:

App.__container__.lookup('controller:controllerName'); // controllers
App.__container__.lookup('router:main'); // routes
App.__container__.lookup('store:main'); // store, adapters, serializers
Ember.View.views['emberViewId'] // objects are dying here occasionally

双下划线告诉我们,这不是在应用程序中构建通信的推荐方法。 :)

答案 1 :(得分:1)

您可以使用帮助程序创建一个新的Ember对象作为其中的方法。

然后,您可以在Application中注册这些帮助程序,并将其注入控制器,模型和视图。

有关详细信息,请参阅http://emberjs.com/guides/understanding-ember/dependency-injection-and-service-lookup/#toc_dependency-injection-with-code-register-inject-code

App = Ember.Application.extend();
Ember.Application.initializer({
   name: 'logger',
   initialize: function(container, application){
   application.register('logger:main', {log: function(m){ console.log(m); }}, {instantiate: false});
   application.inject('route', 'logger', 'logger:main');
   }
});
App.create();

并像

一样使用它
App.IndexRoute = Ember.Route.extend({
   activate: function(){
   // The logger property is injected into all routes
   this.logger.log('Entered the index route!');
   }
});