我遇到了一个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');
}
});
任何原因都适用于型号和型号适配器但不在控制器上?
答案 0 :(得分:0)
我不熟悉Ember.inject.service()
模式,但您是否有理由不使用http://guides.emberjs.com/v1.10.0/understanding-ember/dependency-injection-and-service-lookup/中列出的模式?
另外,如果你已经将node
和azureStorage
抽象到适配器中,为什么要将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友好的服务/依赖注入方式,因为这看起来并不优雅,你复制了很多代码来访问你已经拥有的东西。