이 문제를 일으킨 소스 코드의 위치를 어떻게 찾을 수 있었는지 알고 싶지만 이후 수동으로 문제를 찾을 수있었습니다.
.controller()
응용 프로그램 모듈에 대한 호출을 사용하는 대신 전역 범위에 선언 된 컨트롤러 함수가 있습니다 .
그래서 다음과 같은 것이있었습니다.
function SomeController( $scope, i18n ) { /* ... */ }
이것은 AngularJS에서 잘 작동하지만 맹 글링으로 제대로 작동하려면 다음과 같이 변경해야했습니다.
var applicationModule = angular.module( "example" );
function SomeController( $scope, i18n ) { /* ... */ }
applicationModule.controller( "SomeController", [ "$scope", "i18n", SomeController ] );
추가 테스트 후 실제로 문제를 일으킨 더 많은 컨트롤러의 인스턴스를 발견했습니다. 이것이 내가 수동으로 모든 소스를 찾은 방법입니다 .
우선, uglify 옵션에서 출력 미화를 활성화하는 것이 다소 중요하다고 생각합니다. 우리의 지저분한 작업은 다음을 의미합니다.
options : {
beautify : true,
mangle : true
}
그런 다음 Chrome에서 DevTools를 열어 프로젝트 웹 사이트를 열었습니다. 다음과 같은 오류가 기록됩니다.
우리가 관심을 갖는 호출 추적의 메서드는 화살표로 표시 한 메서드입니다. 이다 providerInjector
에서injector.js
. 예외가 발생하는 곳에 중단 점을 배치하고 싶을 것입니다.
이제 애플리케이션을 다시 실행하면 중단 점에 도달하고 호출 스택을 점프 할 수 있습니다. "Incorrect injection token"문자열에서 인식 할 수있는 invoke
in에서injector.js
호출이 발생 합니다.
locals
매개 변수 (로 엉망이 d
내 코드에서)이 문제가 소스에있는 개체에 대해 꽤 좋은 아이디어를 제공합니다 :
grep
소스를 빠르게 살펴보면의 많은 인스턴스 modalInstance
를 찾을 수 있지만 거기에서 소스에서이 지점을 쉽게 찾을 수 있습니다.
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
다음으로 변경해야합니다.
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
변수에 유용한 정보가없는 경우 스택에서 더 위로 점프 할 수 invoke
있으며 추가 힌트가 있어야 하는 호출을 입력 해야합니다.
다시 발생하지 않도록 방지
이제 문제를 발견 했으므로 앞으로 다시 발생하지 않도록 최선의 방법을 언급해야한다고 생각합니다.
분명히, 당신은 어디에서나 인라인 배열 주석을 사용 하거나 (선호도에 따라) $inject
속성 주석을 사용할 수 있으며 단순히 미래에 그것을 잊지 않도록 노력할 수 있습니다. 그렇게하는 경우 이와 같은 오류를 조기에 포착하려면 엄격한 종속성 주입 모드 를 활성화해야합니다 .
조심해! Angular Batarang을 사용하는 경우 Angular Batarang이 주석이없는 코드를 사용자의 코드에 삽입하므로 StrictDI가 작동하지 않을 수 있습니다 (나쁜 Batarang!).
또는 ng-annotate 가 처리 하도록 할 수 있습니다. 이 영역에서 다음과 같은 실수가 발생할 가능성을 많이 제거하므로 그렇게하는 것이 좋습니다.
- DI 주석 누락
- DI 주석 불완전
- 잘못된 순서의 DI 주석
주석을 최신 상태로 유지하는 것은 당연한 일이며 자동으로 수행 할 수 있다면 그렇게 할 필요가 없습니다. ng-annotate는 정확히 그렇게합니다.
grunt-ng-annotate 및 gulp-ng-annotate 로 빌드 프로세스에 잘 통합되어야합니다 .