使用ember-cli版本0.0.42
运行这些命令
ember new myApp
cd myApp
ember generate service serviceOne
ember generate service serviceTwo
ember generate controller application
进行这些更新
控制器/的application.js
import Ember from 'ember';
export default Ember.Controller.extend({
init: function() {
var a = this.get('serviceOneService.testFunction');
}
});
初始化/服务一service.js
export default {
name: 'service-one-service',
initialize: function(container, app) {
app.inject('route', 'serviceOneService', 'service:service-one');
app.inject('controller', 'serviceOneService', 'service:service-one');
}
};
服务/服务one.js
import Ember from 'ember';
export default Ember.Object.extend({
testFunction: function(){
//How would I make a call to serviceTwo.testFunction here instead of returning 123
return "123"
}
});
服务/服务two.js
import Ember from 'ember';
export default Ember.Object.extend({
testFunction: function(){
return "Test function from service 2"
}
});
我的问题是如何将serviceOne注入服务二,将serviceTwo注入服务一。 我这样做,如何从服务一访问服务二。 在调用时我知道如何将服务直接压入所有控制器,但当我尝试注入testFunction中的另一个对象(服务)时,“this”指的是窗口而不是ember对象。
我的第一个想法是将每个服务注入到整个服务命名空间中,但是我收到了以下消息:
Uncaught Error: Cannot inject a `service:service-one` on other service(s). Register the `service:service-one` as a different type and perform the typeInjection.
您可以通过定义初始化程序并将after
属性设置为以下after
将一个服务注入另一个服务after: ['service-one', 'service-two']
,这将导致它在这两个服务之后运行注册。
初始化程序看起来像......
Ember.Application.initializer({
after: ['service one', 'service two'],
name: 'service injections',
initialize: function(container, application){
application.inject('service:service-one', 'serviceTwoService', 'service:service-two');
}
});
不幸的是,如果你然后尝试注入service:service-one
进入service:service-two
你将得到一个错误,说明Maximum call stack size exceeded
,这是因为容器在尝试查找所有需要的注入时最终处于循环中。
你可以在这里看到一个工作箱: http : //emberjs.jsbin.com/fitaka/1/edit