Kann nicht zu $ ​​rootScope gelangen

162

Die folgende Datei "funktioniert" (das Gefühl, dass sie keine Fehler auslöst):

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script> 
    <script>
        angular.module("modx", [], function($routeProvider) {
        });
    </script>
</html>

aber dieses

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script>
    <script>
        angular.module("modx", [], function($routeProvider, $rootScope) {
        });
    </script>
</html>

gibt den Fehler:

Fehler: Unbekannter Anbieter: $ rootScope von modx Quelldatei
: http://code.angularjs.org/angular-1.0.0rc7.js
Zeile: 2491

WTF?

Malvolio
quelle
114
+1 für WTF als Endergebnis.
Eliran Malka

Antworten:

307

Sie können beispielsweise während der Konfigurationsphase nicht nachfragen - Sie können nur nach Anbietern fragen.

var app = angular.module('modx', []);

// configure stuff
app.config(function($routeProvider, $locationProvider) {
  // you can inject any provider here
});

// run blocks
app.run(function($rootScope) {
  // you can inject any instance here
});

Weitere Informationen finden Sie unter http://docs.angularjs.org/guide/module .

Vojta
quelle
9
Danke, es macht vollkommen Sinn, aber woher wusstest du das? War es in den Dokumenten?
Malvolio
143
@Mavolio Nein, er ist einer der 3 Kernentwickler.
ChrisOdney
8
Nun, FWIW, es befindet sich jetzt in den Dokumenten unter dem Abschnitt "Laden und Abhängigkeiten von Modulen".
Mark Rajcok
1
@vojta Aber was ist, wenn ich Parameter von außen übergeben und in verwenden muss config? Root-Pfad in der asp.net-App sagen? Ich möchte einfach keine globalen Variablen verwenden und wollte Wert verwenden ng-init='root:<%= myroot %>'und verwenden . rootmodule.config
Vittore
7
@vittore Ich denke, diese "externe" Konfiguration in das globale Fenster zu setzen ist in Ordnung. Oder Sie haben ein Modul, das all diese Dinge definiert, und dann laden Sie es in Ihre App - z. angular.module('config', []).constant('appRoot', '/local/js/app');(Dieser Code wird von Ihrem Server generiert (Sie können ihn sogar als JS-Datei generieren, anstatt ihn in die HTML-Datei einzufügen). Dann lädt Ihre App dieses Modul und hat daher Zugriff auf appRoot.
Vojta
7

Ich habe das folgende "Muster" als sehr nützlich empfunden:

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];
function MainCtrl (scope, rootscope, location, thesocket, ...) {

Dabei ist MainCtrl ein Controller. Es ist mir unangenehm, mich darauf zu verlassen, dass die Parameternamen der Controller-Funktion die Instanzen eins zu eins nachahmen, aus Angst, ich könnte Namen ändern und Dinge durcheinander bringen. Ich bevorzuge es sehr, $ inj explizit für diesen Zweck zu verwenden.

Ram Rajamony
quelle
Das ist ordentlich; aber wie greift man MainCtrlso zu?
f1lt3r
Ich weiß, dass Ihr Kommentar alt ist, aber es lohnt sich, Fragen für die Zukunft zu beantworten. Module / Controller können so definiert werden, dass Sie auf folgende Weise darauf zugreifen können:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt
1

Ich empfehle Ihnen nicht, die Syntax so zu verwenden, wie Sie es getan haben. AngularJS können Sie verschiedene Funktionalitäten haben , wie Sie wollen ( run, config, service, factory, etc ..), die mehr professional.In diese Funktion müssen Sie nicht einmal , dass injizieren selbst wie

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];

Sie können es verwenden, wie Sie wissen.

Hazarapet Tunanyan
quelle