如何让两个ember-cli服务进行交叉通信?

时间:2014-09-02 16:59:15

标签: ember.js ember-cli

使用ember-cli版本0.0.42

运行这些命令

ember new myApp
cd myApp
ember generate service serviceOne
ember generate service serviceTwo
ember generate controller application

进行这些更新

controllers / application.js

import Ember from 'ember';

export default Ember.Controller.extend({
    init: function() {
        var a = this.get('serviceOneService.testFunction');
    }
});  

initializers / service-one-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');
    }
};  

services / service-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"
    }
});

services / service-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.   

1 个答案:

答案 0 :(得分:4)

您可以通过定义初始化程序并将after属性设置为类似after: ['service-one', 'service-two']的设置,将一个服务注入另一个服务,这将导致它在两个服务都已注册后运行。 / p>

初始化程序看起来像......

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