2014-09-02 47 views
4

使用烬,CLI版本0.0.42如何让两个ember-cli服务交叉通信?

运行这些命令

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'); 
    } 
}); 

初始化/服务 - 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'); 
    } 
}; 

服务/服务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服务中有两个和服务两个服务于一体。我会这样做,我如何从服务一访问服务二。在调用时我有一个如何将服务直接注入到所有控制器的想法,但是当我尝试注入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. 
+0

你要试图将服务注入到对方吗? – tikotzky 2014-09-02 17:50:18

回答

4

您可以通过定义一个初始化并设置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-oneservice:service-two会得到一个错误,说明Maximum call stack size exceeded这是因为容器在一个循环,而试图结束查找所有需要的注射。

这里你可以看到一个工作斌:http://emberjs.jsbin.com/fitaka/1/edit

+0

感谢jsbin。我在我的ember-cli项目中设置了这个设置,但是当我的ServiceTwoService如下所示时,我不知道如何获得对ServiceTwoService的引用:'从'ember'导入Ember;导出默认Ember.Object.extend({testFunction:函数(){//我如何在这里调用serviceTwo.testFunction而不是返回123返回“abc”;}})' 所以我能够做到这一点进入服务之一,但是当我尝试和this.get('serviceTwoService')。testFunction();这指的是窗口而不是Ember类,所以它表示无法读取未定义的属性'get'。 – Martin 2014-09-04 16:58:08

+0

您遇到范围问题,但除非您保存参考服务的'testFunction',否则'this'应该引用服务一。你可以在垃圾箱里复制吗? – tikotzky 2014-09-04 22:36:37