>我在 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');
}
});
有什么理由适用于模型和适配器,但不适用于控制器?
熟悉Ember.inject.service()
模式,但是您没有理由不使用 http://guides.emberjs.com/v1.10.0/understanding-ember/dependency-injection-and-service-lookup/中概述的模式?
另外,如果您已经将它们抽象到适配器中,为什么要将它们注入node
和azureStorage
控制器? 您应该只使用控制器中的this.store.find('whatever', 123)
来获取数据。 如果 azureStore 与普通的 Ember 数据存储不同,则应创建一个新存储并将其注册到应用程序的容器。 如果将其注入控制器,则可以使用 this.azureStore
或 this.container.lookup('store:azure')
访问它。
此外,开始将内容注入模型不是一个好习惯。 我真的会看看 Ember 友好的服务/依赖注入方式,因为这看起来不是很优雅,而且您正在复制大量代码来访问您已经拥有的东西。