2016-09-07 3 views
0

Ich lade ein Modul auf meiner Basis-HTML-Seite namens userFromServer. Ich möchte es sowohl in das Haupt-App-Modul als auch in das Mixpanel-Modul injizieren. Allerdings bekomme ich einen Injektionsfehler, wenn ich versuche, userFromServer in analytics.mixpanel (angular mixpanel) zu injizieren. Ist das ein zirkulärer Abhängigkeitsfehler oder fehlt mir etwas? sollte userFromServer für alle Module verfügbar sein? Wie kann ich userFromServer in beide Module injizieren?Winkel injizieren Modul in mehrere Module

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 Modul

<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> 

die Stack-Trace ist:

Failed to instantiate module App due to: 

Failed to instantiate module analytics.mixpanel due to: 

Unknown provider: currentUser 
+0

was ist der Fehler, den Sie bekommen? Bitte fügen Sie auch die Modeldefinition userFromServer hinzu. –

+0

Bitte geben Sie die vollständige Fehlermeldung (einschließlich Aufrufliste) und den Code für die relevanten Module an. Der aufgelistete Code enthält nichts, was einen Fehler verursachen könnte (außer der Tatsache, dass es keinen userFromServer gibt). Außerdem verwirren Sie die Injektion mit dem Laden. Module werden * geladen *, es gibt kein Problem mit zirkulären Abhängigkeiten. Abhängigkeiten werden * injiziert *. – estus

+0

@estus aktualisiert mit Code und Stack-Trace – user2954587

Antwort

1

Dies geschieht, weil currentUser Service Instanz in config Block injiziert wird. Hier können nur Service Provider eingespielt werden.

Da currentUser eine Konstante Objekt, das nicht auf andere Dienstleistungen abhängig ist und es sollte während Config-Phase zur Verfügung stehen, ist es constant Dienstleistung sein kann:

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

Da Ihr Elternmodul App bereits hat userFromServer darin injiziert, brauchen Sie nicht, es wieder zu injizieren in analytics.mixpanel.

+0

Eigentlich müssen Sie es für Konsistenz laden, wenn beide Module von diesem Modul abhängen. Darum geht es bei Modularität. Module können auf diese Weise getrennt voneinander verwendet oder getestet werden. – estus

+0

@estus Das Elternmodul 'App' hat bereits sowohl' analytics.mixpanel' als auch 'userFromServer' als Abhängigkeit aufgelistet. Es ist also nicht nötig, 'userFromServer' als Abhängigkeit für das Submodul' analytics.mixpanel' erneut zu injizieren. Ich stimme zu, dass, wenn zwei völlig unabhängige Module eine Abhängigkeit haben, sie sie separat injizieren können, aber hier sind sie * nicht * unabhängig, sondern das erste Modul 'App' hat bereits das zweite Modul' analytics.mixpanel' als Abhängigkeit. –

+0

Wenn "App" direkt von "userFromServer" abhängt und "analytics.mixpanel" irgendwann aus der App entfernt wird, funktioniert die App nicht mehr. Angular erlaubt es, Module an mehreren Stellen genau zu laden, um solche Fälle abzudecken. Dies ist ein Merkmal des Frameworks, und das muss nicht vermieden werden. – estus

Verwandte Themen