Я все ще хотів би знати, як я міг знайти місце у нашому вихідному коді, що спричинив цю проблему, але я з тих пір змогла знайти проблему вручну.
Існувала функція контролера, оголошена в глобальному масштабі, замість того, щоб використовувати .controller()
виклик модуля програми.
Тож було щось подібне:
function SomeController( $scope, i18n ) { /* ... */ }
Це добре працює для AngularJS, але, щоб він працював правильно з mangling, мені довелося змінити його на:
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
Після подальших тестів я фактично виявив кількість контролерів, які також викликали проблеми. Ось як я знайшов джерело всіх вручну :
Перш за все, я вважаю, що це досить важливо, щоб увімкнути покращення виходу в непридатних параметрах. Для нашого грубого завдання, яке означало:
options : {
beautify : true,
mangle : true
}
Потім я відкрив веб-сайт проекту в Chrome, відкривши DevTools. Це призводить до помилки, подібної до наведеної нижче:
Метод у сліді дзвінків, який нас цікавить, - це той, який я позначив стрілкою. Це providerInjector
вinjector.js
. Ви хочете розмістити точку перерви там, де вона кидає виняток:
Коли ви перезапустите програму, точка зупинки буде досягнута, і ви можете перейти до стеку викликів. Буде дзвінок з invoke
входуinjector.js
, розпізнаваний з рядка "Неправильний маркер ін'єкції":
locals
Параметр (підігнані до d
в моєму коді) дає досить гарне уявлення про те, який об'єкт в джерелі є проблемою:
Швидкий пошук grep
нашого джерела знаходить багато примірників modalInstance
, але, переходячи звідти, було легко знайти це місце у джерелі:
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
Що потрібно змінити на:
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
У разі, якщо змінна не містить корисної інформації, ви також можете перейти далі в стек і вам слід натиснути на виклик invoke
якого повинні бути додаткові підказки:
Запобігайте цьому повторення
Тепер, коли ви сподіваємось, що ви знайшли проблему, я вважаю, що мені слід згадати, як найкраще уникнути цього в майбутньому.
Очевидно, що ви можете просто використовувати вбудовану анотацію масиву скрізь або (залежно від ваших уподобань) $inject
анотацію властивостей і просто намагатися не забувати про це в майбутньому. Якщо ви це зробите, переконайтеся, що ввімкнено суворий режим введення залежності , щоб виявити такі помилки як рано.
Стережись! У випадку, якщо ви використовуєте Angular Batarang, StrictDI може не працювати для вас, оскільки Angular Batarang вводить у ваш код ненаголошений код (погано Batarang!).
Або ви могли дозволити ng-annotate подбати про це. Я настійно рекомендую робити це, оскільки це видаляє багато потенціалу для помилок у цій галузі, наприклад:
- Відмітка про DI відсутня
- Анотація DI неповна
- Анотація DI в неправильному порядку
Постійне оновлення приміток - це просто біль у попці, і вам не доведеться робити це, якщо це можна зробити автоматично. ng-annotate робить саме це.
Він повинен добре інтегруватися у ваш процес збирання за допомогою grunt-ng-annotate та gulp-ng-annotate .