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

问题描述 投票:4回答:1

使用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.   
ember.js ember-cli
1个回答
4
投票

您可以通过定义初始化程序并将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

© www.soinside.com 2019 - 2024. All rights reserved.