无法从Ember控制器获得注入的灰烬服务 - 但适用于模型&适配器

时间:2015-04-27 03:32:15

标签: javascript ember.js ember-cli

我遇到了一个Ember CLI项目的问题,我无法从控制器动作函数中获取注入的ember服务。

真正奇怪的是,这完全适用于我的模型和自定义适配器:

控制器:

export default Ember.Controller.extend({
  node: Ember.inject.service(),

  azureStorage: Ember.computed.alias('node.azureStorage'),

  actions: {

    myAction: function () {
      // this returns null
      var x = this.get('azureStorage');
    }
  }
});

// The service code (azureStorage and fs are NOT null)

if (window.requireNode) {
    azureStorage = window.requireNode('azure-storage');
    fs = window.requireNode('fs');
}
export default Ember.Service.extend({
    azureStorage: azureStorage,
    fs: fs,
    getActiveAccount: function (store) {
        return new Ember.RSVP.Promise(function (resolve, reject) {
            var accounts = store.all('account'),
                length = accounts.get('length'),
                i = 0;
            accounts.forEach(function (account) {
                if (account.get('active') === true) {
                    return Ember.run(null, resolve, account);
                }
                i += 1;
                if (i >= length) {
                    return Ember.run(null, reject, 'could not find any active accounts');
                }
            });
        });
    }
});



// the controller test code

var controller = this.subject();
controller.send('myAction');

我原本希望这会返回服务和azureStorage对象。在我的模特和适配器相同的模式工作正常:

export default DS.Adapter.extend({
    serializer: serializer.create(),
    node: Ember.inject.service(),
    azureStorage: Ember.computed.alias('node.azureStorage'),
    findQuery: function () {
      // this returns the value correctly
      var x = this.get('azureStorage');
    }
});

任何原因都适用于型号和型号适配器但不在控制器上?

1 个答案:

答案 0 :(得分:0)

我不熟悉Ember.inject.service()模式,但您是否有理由不使用http://guides.emberjs.com/v1.10.0/understanding-ember/dependency-injection-and-service-lookup/中列出的模式?

另外,如果你已经将nodeazureStorage抽象到适配器中,为什么要将this.store.find('whatever', 123)this.azureStore注入控制器?您应该只使用控制器中的this.container.lookup('store:azure')来获取数据。如果您的azureStore与普通的Ember数据存储不同,那么您应该创建一个新的商店并将其注册到应用程序的容器中。如果您将其注入控制器,则可以使用$img = new Imagine\GMagick\Image(new Gmagick($rewritten_url)); $img->rotate(90); $img->save($path_on_mongo); 或{{1}}访问它。

此外,开始在模型中注入东西并不是一个好习惯。我真的会看一下Ember友好的服务/依赖注入方式,因为这看起来并不优雅,你复制了很多代码来访问你已经拥有的东西。