Nadal chciałbym wiedzieć, jak mogłem znaleźć miejsce w naszym kodzie źródłowym, które spowodowało ten problem, ale od tego czasu udało mi się znaleźć problem ręcznie.
W zasięgu globalnym została zadeklarowana funkcja kontrolera zamiast .controller()
wywołania modułu aplikacji.
Więc było coś takiego:
function SomeController( $scope, i18n ) { /* ... */ }
Działa to dobrze dla AngularJS, ale aby działało dobrze z zniekształceniem, musiałem to zmienić na:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Po dalszych testach faktycznie znalazłem wystąpienia większej liczby kontrolerów, które również powodowały problemy. Oto jak ręcznie znalazłem źródło ich wszystkich :
Przede wszystkim uważam za dość ważne włączenie upiększania produkcji w opcjach uglify. W przypadku naszego podstawowego zadania oznaczało to:
options : {
beautify : true,
mangle : true
}
Następnie otworzyłem witrynę projektu w przeglądarce Chrome z otwartymi narzędziami DevTools. Co powoduje rejestrowanie błędu takiego jak ten poniżej:
Metoda w śledzeniu wywołań, która nas interesuje, to ta, którą zaznaczyłem strzałką. To jest providerInjector
winjector.js
. Będziesz chciał umieścić punkt przerwania, w którym zgłosi wyjątek:
Kiedy teraz ponownie uruchomisz aplikację, punkt przerwania zostanie osiągnięty i możesz przeskoczyć w górę stosu wywołań. Pojawi się wywołanie z invoke
ininjector.js
, które można rozpoznać po ciągu „Nieprawidłowy token wstrzyknięcia”:
locals
Parametr (zniekształcone, aby d
w moim kodu) daje całkiem dobry pomysł, o który obiekt w źródle jest problem:
Szybkie przeglądanie grep
naszego źródła znajduje wiele przykładów modalInstance
, ale stamtąd łatwo było znaleźć to miejsce w źródle:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Które należy zmienić na:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
W przypadku, gdy zmienna nie zawiera przydatnych informacji, możesz również wskoczyć dalej na stos i powinieneś trafić call, do invoke
którego powinno mieć dodatkowe podpowiedzi:
Zapobiegaj ponownemu wystąpieniu tego zdarzenia
Teraz, gdy masz nadzieję, że znalazłeś problem, czuję, że powinienem wspomnieć, jak najlepiej uniknąć powtórzenia się tego w przyszłości.
Oczywiście możesz po prostu użyć adnotacji tablicy wbudowanej wszędzie lub (w zależności od twoich preferencji) $inject
adnotacji właściwości i po prostu spróbować nie zapomnieć o tym w przyszłości. Jeśli to zrobisz, upewnij się, że włączyłeś tryb ścisłego wstrzykiwania zależności , aby wcześnie wychwycić takie błędy.
Uważaj! Jeśli używasz Angular Batarang, StrictDI może nie działać dla Ciebie, ponieważ Angular Batarang wstrzykuje niezanotowany kod do twojego (zły Batarang!).
Możesz też pozwolić, by ng-annotate się tym zajął. Gorąco polecam, ponieważ usuwa wiele potencjalnych błędów w tym obszarze, takich jak:
- Brak adnotacji DI
- Niekompletna adnotacja DI
- Adnotacja DI w złej kolejności
Utrzymywanie aktualności adnotacji to po prostu wrzód na dupie i nie powinieneś tego robić, jeśli można to zrobić automatycznie. ng-annotate robi dokładnie to.
Powinien ładnie zintegrować się z procesem kompilacji za pomocą grunt-ng-annotate i gulp-ng-annotate .