我应该在Ember App Kit中将课程重新开放放在哪里?

时间:2014-02-11 18:50:14

标签: javascript ember.js

由于Ember App Kit使用ES6模块,我对放置或配置基类的代码的最佳位置感到困惑。例如,以下代码允许对无散列URL使用html5历史记录:

//enable HTML5
Router.reopen({ location: 'history' });

或者以下代码为所有视图提供了一个afterRender挂钩:

Ember.View.reopen({
    didInsertElement : function() {
        this._super();
        Ember.run.scheduleOnce('afterRender', this, this.didRenderElement);
    }
});

根据我在阅读Ember App Kit的github上的问题以及stackoverflow上的各种答案后的理解,它非常适合ES6模块仅导出而不包含任何“副作用”,换句话说,代码是不是导出对象的一部分。然而,似乎副作用技术目前正在使用,甚至被许多开发人员建议。例如,我将html5历史记录配置放在我的 router.js 模块中:

/**
 * Ember Router
 *
 * @module Router
 * @exports appkit/Router
 */

var Router = Ember.Router.extend({});

//enable HTML5
Router.reopen({ location: 'history' });

Router.map(function() {
  this.route('login');
  this.route('logout');
  this.route('dashboard');
  this.route('orders');
  this.route('customers');
});

export default Router;

你可以看到模块导出了Router对象,但是reopen语句只是松散地放在文件中。

为了保持组织有序并利用这项技术,我想我可以创建一个配置文件夹,然后在文件夹中创建模块,如view.js,router.js等:

view.js

/**
 * Ember ViewConfig
 *
 * @module ViewConfig
 * @exports appkit/ViewConfig
 */

Ember.View.reopen({
  didInsertElement : function() {
    this._super();
    Ember.run.scheduleOnce('afterRender', this, this.didRenderElement);
  }
});

export default {};

app.js

/*
 * Config Classes
 */
import ViewConfig from 'appkit/config/view';
import RouterConfig from 'appkit/config/router';
...

这很有效,但我觉得我打破了一个惯例。这有意义还是我错过了什么?

修改 我想另一种解决方案是使用函数导出对象,例如 applyConfig ,然后在App.js中导入该函数后调用。但这并没有解决我仍然在App.js中使用“副作用”的事实。

1 个答案:

答案 0 :(得分:2)

由于最近这个问题得到了提升,我想提供一个答案,我从Ember App Kit的作者之一(stefanpenner)那里得到了答案。您可以在此处阅读讨论:https://github.com/stefanpenner/ember-app-kit/issues/485

基本上我是在正确的路径而不是config文件夹,他建议使用ext文件夹并导入app.js。我认为“副作用”并不是什么大问题。他确实承认“这确实感觉到了什么 - 什么hacky”,他对建议持开放态度......