この問題の原因となったソースコード内の場所を見つける方法を知りたいのですが、それ以来、手動で問題を見つけることができました。
.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でプロジェクトのWebサイトを開き、DevToolsを開きました。これにより、以下のようなエラーがログに記録されます。
関心のある呼び出しトレースのメソッドは、矢印でマークしたものです。これはproviderInjector
にありinjector.js
ます。例外をスローする場所にブレークポイントを配置したいとします。
ここでアプリケーションを再実行すると、ブレークポイントがヒットし、コールスタックをジャンプアップできます。invoke
ininjector.js
からの呼び出しがあり、「不正な注入トークン」文字列から認識できます。
locals
パラメータ(に台無しにd
私のコードでは)問題であり、あなたのソース内のどのオブジェクトについてはかなり良いアイデアを与えます:
grep
ソースをすばやく確認すると、の多くのインスタンスが見つかりますがmodalInstance
、そこからソース内でこの場所を見つけるのは簡単でした。
var ModalCreateEditMeetingController = function( $scope, $modalInstance ) {
};
これを次のように変更する必要があります。
var ModalCreateEditMeetingController = [ "$scope", "$modalInstance", function( $scope, $modalInstance ) {
} ];
変数に有用な情報が含まれていない場合は、スタックをさらに上に移動して、invoke
追加のヒントが必要な呼び出しをヒットする必要があります。
これが再発しないようにする
うまくいけば問題を見つけたので、今後この問題が再発しないようにするための最善の方法について触れておきたいと思います。
言うまでもなく、どこでもインライン配列注釈または(好みに応じて)$inject
プロパティ注釈を使用するだけで、将来そのことを忘れないようにできます。その場合は、このようなエラーを早期に検出するために、厳密な依存関係注入モードを有効にしてください。
気を付けて!Angular Batarangを使用している場合は、StrictDIが機能しない可能性があります。AngularBatarangが注釈なしのコードを挿入するためです(悪いBatarang!)。
または、ng-annotateに処理を任せることもできます。次のように、この領域でのミスの可能性を大幅に取り除くため、そうすることを強くお勧めします。
- DIアノテーションがありません
- DIアノテーションが不完全
- DIアノテーションの順序が間違っている
アノテーションを最新の状態に保つことは、単にお尻の痛みであり、自動的に実行できるのであれば、そうする必要はありません。ng-annotateはまさにそれを行います。
grunt-ng-annotateとgulp-ng-annotateを使用してビルドプロセスにうまく統合できます。