Ich würde immer noch gerne wissen, wie ich den Ort in unserem Quellcode hätte finden können, der dieses Problem verursacht hat, aber seitdem konnte ich das Problem manuell finden.
Es wurde eine Controller-Funktion für den globalen Bereich deklariert, anstatt einen .controller()
Aufruf für das Anwendungsmodul zu verwenden.
Es gab also so etwas:
function SomeController( $scope, i18n ) { /* ... */ }
Dies funktioniert gut für AngularJS, aber damit es beim Mangeln richtig funktioniert, musste ich es ändern in:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Nach weiteren Tests fand ich tatsächlich Instanzen von mehr Controllern, die ebenfalls Probleme verursachten. So habe ich die Quelle aller manuell gefunden :
Zunächst halte ich es für ziemlich wichtig, die Verschönerung der Ausgabe in den uglify-Optionen zu aktivieren. Für unsere Grunzaufgabe bedeutete das:
options : {
beautify : true,
mangle : true
}
Ich habe dann die Projektwebsite in Chrome mit geöffneten DevTools geöffnet. Was dazu führt, dass ein Fehler wie der folgende protokolliert wird:
Die Methode in der Anrufverfolgung, an der wir interessiert sind, ist die, die ich mit einem Pfeil markiert habe. Das ist providerInjector
ininjector.js
. Sie möchten einen Haltepunkt platzieren, an dem eine Ausnahme ausgelöst wird:
Wenn Sie die Anwendung jetzt erneut ausführen, wird der Haltepunkt erreicht und Sie können den Aufrufstapel hochspringen. Es erfolgt ein Anruf von invoke
ininjector.js
, erkennbar an der Zeichenfolge "Falsches Injektionstoken":
Der locals
Parameter ( d
in meinem Code entstellt ) gibt eine ziemlich gute Vorstellung davon, welches Objekt in Ihrer Quelle das Problem ist:
Ein kurzer Blick grep
auf unsere Quelle findet viele Beispiele von modalInstance
, aber von dort aus war es einfach, diesen Punkt in der Quelle zu finden:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Welches muss geändert werden zu:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
Falls die Variable keine nützlichen Informationen enthält, können Sie auch weiter nach oben springen und einen Aufruf ausführen, invoke
der zusätzliche Hinweise enthalten sollte:
Verhindern Sie, dass dies erneut geschieht
Nachdem Sie das Problem hoffentlich gefunden haben, sollte ich erwähnen, wie Sie am besten verhindern können, dass dies in Zukunft erneut auftritt.
Natürlich können Sie einfach die Inline-Array-Annotation überall oder die (je nach Ihren Präferenzen) $inject
Eigenschafts-Annotation verwenden und einfach versuchen, sie in Zukunft nicht zu vergessen. Wenn Sie dies tun, stellen Sie sicher, dass Sie den strengen Abhängigkeitsinjektionsmodus aktivieren, um solche Fehler frühzeitig zu erkennen.
Achtung! Wenn Sie Angular Batarang verwenden, funktioniert StrictDI möglicherweise nicht für Sie, da Angular Batarang nicht kommentierten Code in Ihren Code einfügt (schlechter Batarang!).
Oder Sie können ng-annotate sich darum kümmern lassen. Ich kann dies nur empfehlen, da dadurch viel Fehlerpotential in diesem Bereich beseitigt wird, wie z.
- DI-Anmerkung fehlt
- DI-Anmerkung unvollständig
- DI-Anmerkung in falscher Reihenfolge
Die Anmerkungen auf dem neuesten Stand zu halten, ist einfach eine Qual und Sie sollten es nicht tun müssen, wenn es automatisch möglich ist. ng-annotate macht genau das.
Es sollte sich mit grunt-ng-annotate und gulp-ng-annotate gut in Ihren Erstellungsprozess integrieren lassen .