Ember.js:如何将依赖注入适配器?

时间:2014-09-01 10:11:57

标签: ember.js dependency-injection

我正在尝试将一些全局应用程序配置(或状态或选项)注入到所有组件中,例如路由,控制器和数据适配器。 不知道为什么这段代码不会将依赖注入数据适配器。也许问题在于订购?

var App = Ember.Application.create({
    LOG_TRANSITIONS: true,
    LOG_VIEW_LOOKUPS: true
});

var RESTAdapter = DS.RESTAdapter.extend({

    primaryKey: '_id',

    buildURL: function() {
        var locale = this.get('options.locale');
        return locale + this._super.apply(this, arguments);
    }

});

App.ApplicationStore = DS.Store.extend({
    adapter: RESTAdapter
});

App.initializer({

    name: 'options',

    initialize: function(container, app) {
        var o = Ember.Object.create();
        o.set('default-locale', 'en');
        app.register('globals:options', o, { instantiate: false, singleton: true });
    }

});

App.initializer({

    name: 'injectOptions',
    before: 'options',

    initialize: function(container, app) {
        app.inject('controller', 'options', 'globals:options'); // OK
        app.inject('route', 'options', 'globals:options'); // OK
        app.inject('data-adapter', 'options', 'globals:options'); // not working
        app.inject('dataAdapter', 'options', 'globals:options'); // not working
        app.inject('adapter', 'options', 'globals:options'); // not working
        app.inject('store', 'options', 'globals:options'); // ???
    }

});

1 个答案:

答案 0 :(得分:2)

注入是在创建时完成的,很可能商店和适配器可能只是在注入发生之前创建。只需将初始化程序设置为ember-data之前。

App.initializer({
  before:'ember-data',
    name: 'options',

    initialize: function(container, app) {
        var o = Ember.Object.create();
        o.set('default-locale', 'en');
        app.register('globals:options', o, { instantiate: false, singleton: true });
    }

});

App.initializer({

    name: 'injectOptions',
    before: 'options',

    initialize: function(container, app) {
        app.inject('controller', 'options', 'globals:options'); // OK
        app.inject('route', 'options', 'globals:options'); // OK
        app.inject('data-adapter', 'options', 'globals:options'); // not working
        app.inject('dataAdapter', 'options', 'globals:options'); // not working
        app.inject('adapter', 'options', 'globals:options'); // not working
        app.inject('store', 'options', 'globals:options'); // ???
    }

});

示例:http://emberjs.jsbin.com/OxIDiVU/1012/edit

另外声明商店是不推荐使用的模式。你应该声明适配器:

var RESTAdapter = DS.RESTAdapter.extend({

    primaryKey: '_id',

    buildURL: function() {
        var locale = this.get('options.locale');
        return locale + this._super.apply(this, arguments);
    }

});

App.ApplicationAdapter = RESTAdapter;