3

假设我有以下app.js文件(当前不使用 EAK、、、、Ember 1.4.0Handlebars 1.3.0jQuery 2.1.0它设置了不同的“单例”实例,可以App.#name在整个应用程序中访问(不仅ControllersRoutes或者Views,还有Helpers,自定义Utils等等),比如:

window.App = Ember.Application.create({});

App.CustomAjax = App.utils.ajax.CustomAjax.create({secHash: 'someSecurityHash'});
App.BrowserStateListener = App.utils.browser.BrowserStateListener.create();
App.UserManager = App.utils.user.CustomUserManager.create({user: App.utils.user.User.create({}), someOtherDependency: RAApp.utils.some.SomeOtherDependency.create({someValue: 'someValue'})});
....

......还有更多这样的。

我如何将它转移到 ES6-Modules 中,以便我可以在这个应用程序中使用 EAK?我应该Ember.Application.initializer为此目的使用,以便我可以像这样从方法的application参数中引用应用程序initialize吗?

import Resolver from 'ember/resolver';
import CustomAjax from 'appkit/utils/ajax/custom-ajax';

var App = Ember.Application.extend({
  LOG_ACTIVE_GENERATION: true,
  LOG_MODULE_RESOLVER: true,
  LOG_TRANSITIONS: true,
  LOG_TRANSITIONS_INTERNAL: true,
  LOG_VIEW_LOOKUPS: true,
  modulePrefix: 'appkit', // TODO: loaded via config
  Resolver: Resolver['default']
});

Ember.Application.initializer({
  name: 'init1',

  initialize: function (container, application) {
    // set it like this?
    application.CustomAjax = CustomAjax.create({secHash: 'someSecurityHash'});
  }
});

export default App;

但是,我将如何import只使用CustomAjax对象 - 或我这样设置的任何其他对象?如果我尝试,import App from 'appkit/app'我不会获得整个应用程序命名空间,是吗?

4

1 回答 1

2

您应该看看将这些对象注入为所有 Ember 对象的依赖项:

Ember.Application.initializer({
  name: 'init1',

  initialize: function (container, application) {
    var customAjax = App.utils.ajax.CustomAjax.create({secHash: 'someSecurityHash'});
    container.register('custom:ajax', customAjax);
    // inject this object into all ember controllers
    container.injection('controller', 'custom:ajax', 'customAjax');
  }
}):

App.SomeController = Ember.ObjecctController.extend({
    // this object will be injected upon instantiation
    customAjax: null   
}):

Matt Beale有一个关于 Ember 依赖注入的演讲。

此外,如果您需要在发送之前修改 ajax 请求,您可以使用 Ember.$.ajaxSetup 挂钩。

于 2014-03-05T14:59:44.873 回答