2014-02-06 15 views
6

Lassen Sie uns sagen, ich habe ein Modul App genannt, die genannten zwei weitere Module injiziert Fabriken und Controller:AngularJS: Share Werk zwischen mehreren Modulen

var app = angular.module("app", ["factories", "controllers", "directives"]) 
.run(function ($rootScope, userFactory) { 
    userFactory.property = "someKickstartValue"; 
}); 

Die Fabriken Modul enthält alle Fabriken:

var factories = angular.module("factories", []), 
factory = factories.factory("testFactory", { 
    property: "someValue" 
}); 

Und die Controller Modul enthält alle Controller:

var controllers = angular.module("controllers", ["factories"]), 
controller = controllers.controller("controller", function ($scope, testFactory) { 
    console.log(testFactory.property); // Returns "Some Value" and not 
             // "someKickstartValue" as expected. 
}); 

Die eigentliche Frage:

Warum wird die "someKickstartValue" nicht auf die Regler gelten? Soweit ich verstehe, das Modul App hat eigene testFactory Instanz und das Modul Controller hat es auch, so dass es keine Informationen zwischen Modulen über Fabriken geteilt werden kann. Gibt es einen Weg, oder habe ich einen Fehler gemacht?

+0

In der ersten Zeile, starten 'var app' haben Sie falsch geschrieben" Fabriken " – Mawg

+0

@Mawg Danke. Ich habe es geändert. Sollte jetzt korrekt sein :) – tmuecksch

Antwort

6

Ich reparierte es durch Entfernen der "Fabriken" Abhängigkeit des Controllers.

var controllers = angular.module("controllers", []), 
controller = controllers.controller("controller", function ($scope, testFactory) { 
    console.log(testFactory.property); // Returns "someKickstartValue" as expected 
}); 

Weil ich jetzt nicht ausdrücklich erklären, Fabriken als Abhängigkeit, die Controller Modul nicht erstellen funktioniert es eigene Instanz von Fabriken ist und hat Zugriff auf die Instanz des App-Modul, das die einspritzt Controller Modul.

+0

Sind Sie sicher, dass das der richtige Weg ist? Indem Sie in die App injizieren, injizieren Sie alle Controller dieser App. Wenn nur einige Controller die Abhängigkeit von "Fabriken" benötigen, warum sollte man dann nicht nur diese Controller und nicht die gesamte App einbinden? Bitte beachte, dass ich kein angularer Guru bin. – Mawg

+1

@Mawg Inzwischen bin ich auf eckig 4 ​​umgestiegen. Das ist mir nicht mehr in den Sinn gekommen. Aber soweit ich mich erinnere, könnten Sie recht haben. Probieren Sie einfach aus, was passiert, wenn Sie die "Fabriken" Injektion in der ersten Zeile des Eröffnungsbeitrags entfernen. – tmuecksch

+0

Ich möchte den Schalter selbst machen, bin mir aber nicht sicher, ob die Zeit noch stimmt. Weißt du zum Beispiel, ob Angular 4 UI-Bootstrap oder andere Angular 1.x-Dateien verwenden kann? – Mawg

3

Ich hatte das gleiche Problem. Ich löste es auf folgende Weise:

// modules.js 
(function (angular) { 
    angular.module("shared", []); 
    angular.module("user", ["shared"]); 
    angular.module("admin", ["shared"]); 
})(window.angular); 

Eine solche Struktur ermöglicht Fabriken zu verwenden, Dienstleistungen, angebracht Richtlinien zum gemeinsamen Modul in anderen Modulen.

Verwandte Themen