Nie można dostać się do $ rootScope

162

Poniższy plik "działa" (to poczucie, że nie generuje żadnych błędów):

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

ale to

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

podaje błąd:

Błąd: nieznany dostawca: $ rootScope z
pliku źródłowego modx : http://code.angularjs.org/angular-1.0.0rc7.js
Linia: 2491

WTF?

Malvolio
źródło
114
+1 dla WTF jako wynik końcowy.
Eliran Malka

Odpowiedzi:

307

Nie możesz zapytać na przykład w fazie konfiguracji - możesz zapytać tylko o dostawców.

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
});

Więcej informacji można znaleźć pod adresem http://docs.angularjs.org/guide/module .

Vojta
źródło
9
Dzięki, to ma sens, ale skąd to wiedziałeś? Czy to było w dokumentach?
Malvolio
143
@Mavolio Nie, jest jednym z trzech głównych programistów.
ChrisOdney
8
Cóż, FWIW, jest teraz w dokumentacji, w sekcji „Ładowanie modułów i zależności”.
Mark Rajcok
1
@vojta Ale co, jeśli muszę przekazać parametr z zewnątrz i użyć go w config? powiedzieć ścieżkę główną w aplikacji asp.net? Po prostu nie chcę używać zmiennych globalnych i chciałem ng-init='root:<%= myroot %>'używać rootwartości w module.config.
vittore
7
@vittore Myślę, że umieszczenie tej „zewnętrznej” konfiguracji w oknie globalnym jest w porządku. Lub mając jeden moduł, który definiuje wszystkie te rzeczy, a następnie ładujesz go do swojej aplikacji - np. angular.module('config', []).constant('appRoot', '/local/js/app');(ten kod byłby generowany przez twój serwer (możesz nawet wygenerować go jako plik JS, zamiast wstawiać go do pliku html). Następnie twoja aplikacja ładuje ten moduł i dzięki temu ma dostęp do appRoot.
Vojta
7

Uważam, że następujący „wzorzec” jest bardzo przydatny:

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

gdzie MainCtrl jest kontrolerem. Czuję się nieswojo polegając na nazwach parametrów funkcji kontrolera, wykonując naśladowanie instancji jeden do jednego z obawy, że mogę zmienić nazwy i zepsuć rzeczy. Zdecydowanie wolę jawnie używać do tego celu $ inject.

Ram Rajamony
źródło
To fajne; ale jak uzyskać MainCtrltaki dostęp ?
f1lt3r
Wiem, że Twój komentarz jest stary, ale na przyszłość warto odpowiadać na pytania. Moduły / kontrolery można definiować w ten sposób, aby uzyskać do nich dostęp w następujący sposób:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt.
1

Nie sugeruję używania składni tak, jak to zrobiłeś. Angularjs pozwala mieć różne funkcje, jak chcesz ( run, config, service, factory, itd ..), które są bardziej professional.In funkcja ta nawet nie trzeba wstrzykiwać, że sam jak

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

możesz go użyć, jak wiesz.

Hazarapet Tunanyan
źródło