2016-09-07 214 views
0

我在我的基本html页面上加载了一个模块,名为userFromServer。我想将它注入主应用模块和mixpanel模块。但是,如果我尝试将userFromServer注入analytics.mixpanelangular mixpanel),则会出现注射错误。这是一个循环依赖错误还是我错过了什么?应该userFromServer可用于所有模块?我怎样才能将userFromServer注入到两个模块中?将角度注入模块到多个模块

var app = angular.module('App', ['userFromServer', 'analytics.mixpanel']) 
// main app with currentUser injectable 
var mixp = angular.module('analytics.mixpanel', ['userFromServer']) 
mixp.config(['$mixpanelProvider', 'currentUser', function($mixpanelProvider, currentUser) { 
// use currentUser here 
}]); 

userFromServer模块

<body ng-app="App" ng-cloak> 
    <base href="/"> 

    <div class="container"> 
    <div ng-view=""></div> 
    </div> 

    <script type="text/javascript"> 
    angular.module('userFromServer', []) 
     .service('currentUser', function() { 
     <% if logged_in %> 
      this.name = '<%= @User.name %>'; 
      this.first_name = '<%= @User.first_name %>'; 
      this.id = '<%= @User.id %>'; 
      this.uuid = '<%= @User.profile.uuid %>'; 
     <% end %> 
     }) 
    </script> 


</body> 

堆栈跟踪是:

Failed to instantiate module App due to: 

Failed to instantiate module analytics.mixpanel due to: 

Unknown provider: currentUser 
+0

什么是你所得到的错误?还请包含userFromServer模式定义。 –

+0

请提供完整的错误信息(包括调用堆栈)和相关模块的代码。列出的代码不包含任何可能导致错误的内容(除了没有userFromServer的事实)。此外,你正在注入与加载混淆。模块正在被加载*,循环依赖没有问题。依赖性被注入*。 – estus

+0

@estus使用代码和堆栈跟踪进行更新 – user2954587

回答

1

发生这种情况是因为currentUser服务实例被注入到config块中。只有服务提供商可以在这里注入。

由于currentUser是不依赖于其他服务,并在配置阶段,它应该提供一个恒定的对象,也可能是constant服务:

angular.module('userFromServer', []) 
    .constant('currentUser', { 
    <% if logged_in %> 
     name: '<%= @User.name %>', 
     first_name: '<%= @User.first_name %>', 
     id: '<%= @User.id %>', 
     uuid: '<%= @User.profile.uuid %>' 
    <% end %> 
    }) 
1

由于父模块App已经有了userFromServer在它注入,你并不需要再次注射它analytics.mixpanel

+0

实际上,如果两个模块都依赖于此模块,则需要加载它才能保持一致。这就是模块化的意义所在。模块可以通过这种方式彼此分开使用或测试。 – estus

+0

@estus父模块'App'已经列出了'analytics.mixpanel'和'userFromServer',因为它是依赖关系。因此,不需要再次为子模块“analytics.mixpanel”注入'userFromServer'作为依赖项。 我同意,如果两个完全独立的模块有一个依赖关系,他们可以单独注入它,但在这里它们不是*独立的,而是第一个模块'App'已经具有第二个模块'analytics.mixpanel',因为它是依赖关系。 –

+0

如果'App'直接依赖'userFromServer'并且'analytics.mixpanel'在某个时候从应用中删除,那么该应用将停止工作。 Angular允许模块在几个地方准确地加载以覆盖这些情况,这是该框架的一个功能,无需避免这种情况。 – estus