2014-09-02 33 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