Saya masih ingin tahu bagaimana saya dapat menemukan tempat di kode sumber kami yang menyebabkan masalah ini, tetapi sejak itu saya dapat menemukan masalahnya secara manual.
Ada fungsi pengontrol yang dideklarasikan pada cakupan global, alih-alih menggunakan .controller()
panggilan pada modul aplikasi.
Jadi ada yang seperti ini:
function SomeController( $scope, i18n ) { /* ... */ }
Ini berfungsi dengan baik untuk AngularJS, tetapi untuk membuatnya berfungsi dengan benar dengan mangling, saya harus mengubahnya menjadi:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Setelah tes lebih lanjut, saya benar-benar menemukan contoh lebih banyak pengontrol yang juga menyebabkan masalah. Beginilah cara saya menemukan sumber semuanya secara manual :
Pertama-tama, saya menganggap cukup penting untuk mengaktifkan kecantikan keluaran dalam opsi uglify. Untuk tugas kasar kami yang berarti:
options : {
beautify : true,
mangle : true
}
Saya kemudian membuka situs web proyek di Chrome, dengan DevTools terbuka. Yang menghasilkan kesalahan seperti yang di bawah ini sedang dicatat:
Metode dalam pelacakan panggilan yang kami minati, adalah yang saya tandai dengan panah. Ini providerInjector
masukinjector.js
. Anda akan ingin menempatkan breakpoint di mana ia mengeluarkan pengecualian:
Saat Anda sekarang menjalankan ulang aplikasi, breakpoint akan terkena dan Anda dapat melompat ke tumpukan panggilan. Akan ada panggilan dari invoke
dalaminjector.js
, dikenali dari string "Token injeksi salah":
The locals
parameter (hancur ke d
dalam kode saya) memberikan ide yang cukup baik tentang yang objek dalam sumber Anda adalah masalah:
Sekilas grep
sumber kami menemukan banyak contoh modalInstance
, tetapi pergi dari sana, mudah untuk menemukan tempat ini di sumber:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Yang harus diubah menjadi:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
Jika variabel tidak menyimpan informasi yang berguna, Anda juga dapat melompat lebih jauh ke atas tumpukan dan Anda harus menekan panggilan invoke
yang seharusnya memiliki petunjuk tambahan:
Cegah hal ini terjadi lagi
Sekarang setelah Anda menemukan masalahnya, saya merasa bahwa saya harus menyebutkan cara terbaik untuk menghindari hal ini terjadi lagi di masa mendatang.
Jelas, Anda bisa saja menggunakan anotasi larik sebaris di mana-mana, atau $inject
anotasi properti (bergantung pada preferensi Anda) dan mencoba untuk tidak melupakannya di masa mendatang. Jika Anda melakukannya, pastikan untuk mengaktifkan mode injeksi ketergantungan ketat , untuk menangkap kesalahan seperti ini sedini mungkin.
Awas! Jika Anda menggunakan Angular Batarang, StrictDI mungkin tidak berfungsi untuk Anda, karena Angular Batarang menyuntikkan kode tanpa pemberitahuan ke akun Anda (Batarang buruk!).
Atau Anda bisa membiarkan ng-anotasi mengurusnya. Saya sangat merekomendasikan melakukannya, karena ini menghilangkan banyak potensi kesalahan di area ini, seperti:
- Anotasi DI hilang
- Anotasi DI tidak lengkap
- Anotasi DI dalam urutan yang salah
Menjaga anotasi tetap mutakhir hanya merepotkan dan Anda tidak perlu melakukannya jika dapat dilakukan secara otomatis. ng-annotate melakukan hal itu.
Ini harus terintegrasi dengan baik ke dalam proses build Anda dengan grunt-ng-annotate dan gulp-ng-annotate .