Mi piacerebbe ancora sapere come avrei potuto trovare il posto nel nostro codice sorgente che ha causato questo problema, ma da allora sono stato in grado di trovare il problema manualmente.
C'era una funzione del controller dichiarata nell'ambito globale, invece di utilizzare una .controller()
chiamata sul modulo dell'applicazione.
Quindi c'era qualcosa del genere:
function SomeController( $scope, i18n ) { /* ... */ }
Funziona benissimo per AngularJS, ma per farlo funzionare correttamente con il mangling, ho dovuto cambiarlo in:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Dopo ulteriori test, ho effettivamente trovato istanze di più controller che hanno anche causato problemi. Ecco come ho trovato manualmente l'origine di tutti loro :
Prima di tutto, considero piuttosto importante abilitare l'abbellimento dell'output nelle opzioni uglify. Per il nostro compito grugnito ciò significava:
options : {
beautify : true,
mangle : true
}
Ho quindi aperto il sito Web del progetto in Chrome, con i DevTools aperti. Il che si traduce in un errore come quello seguente che viene registrato:
Il metodo nel tracciamento delle chiamate a cui siamo interessati è quello che ho contrassegnato con una freccia. Questo è providerInjector
dentroinjector.js
. Dovrai posizionare un punto di interruzione in cui genera un'eccezione:
Quando ora riesegui l'applicazione, il punto di interruzione verrà raggiunto e potrai saltare lo stack di chiamate. Ci sarà una chiamata da invoke
ininjector.js
, riconoscibile dalla stringa "token di iniezione errato":
Il locals
parametro (modificato d
nel mio codice) dà un'idea abbastanza buona su quale oggetto nella tua sorgente è il problema:
Un rapido grep
sulla nostra fonte trova molti casi di modalInstance
, ma da lì, è stato facile trovare questo punto nella fonte:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Che deve essere modificato in:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
Nel caso in cui la variabile non contenga informazioni utili, puoi anche saltare più in alto nello stack e dovresti premere una chiamata a invoke
cui dovresti avere suggerimenti aggiuntivi:
Evita che ciò accada di nuovo
Ora che si spera che abbia trovato il problema, sento di dover menzionare come evitare al meglio che ciò accada di nuovo in futuro.
Ovviamente, potresti semplicemente usare l' annotazione dell'array inline ovunque, o l' $inject
annotazione della proprietà (a seconda delle tue preferenze) e cercare semplicemente di non dimenticartene in futuro. Se lo fai, assicurati di abilitare la modalità di inserimento delle dipendenze rigorose , per rilevare errori come questo in anticipo.
Attento! Nel caso tu stia usando Angular Batarang, StrictDI potrebbe non funzionare per te, poiché Angular Batarang inietta codice non annotato nel tuo (cattivo Batarang!).
Oppure puoi lasciare che ng-annotate se ne occupi. Consiglio vivamente di farlo, poiché rimuove molti potenziali errori in quest'area, come:
- Annotazione DI mancante
- Annotazione DI incompleta
- Annotazione DI nell'ordine sbagliato
Mantenere aggiornate le annotazioni è semplicemente un rompicoglioni e non dovresti farlo se può essere fatto automaticamente. ng-annotate fa esattamente questo.
Dovrebbe integrarsi perfettamente nel tuo processo di compilazione con grunt-ng-annotate e gulp-ng-annotate .