web-dev-qa-db-ja.com

「不明なプロバイダー」エラーの原因を見つける

次のエラーが表示されます。

Error: [$injector:unpr] Unknown provider: nProvider <- n

これは縮小プロセスによって引き起こされていることがわかっており、その理由はわかります。しかし、実際に問題を引き起こしているファイルを特定する簡単な方法はありますか?

39
Brett Postin

Angular 1.3.xには、ng-appディレクティブと同じ要素に配置されるng-strict-diディレクティブがあります。この要素により、依存関係に注釈が付けられていない場合、アプリはエラーをスローします。それでも問題のコードの行番号は表示されませんが、パラメーター(つまり、function($ scope、myServiceName))を含む関数が表示されます。コード編集。

ディレクティブの概要: ng-strict-di

27
ansorensen

私は質問を理解し、答えがあります。それはほんの少し複雑です。

私が問題を見つけた方法は、すべての識別子をすべて一意にするために名前を変更し、コンパイルされたjavascriptで探したいものを取得することでした。

glify (プルリクエスト保留中...)の修正版をダウンロード

brew install nodeノードがインストールされていない場合。

./bin/uglifyjs --unique_ids original.min.js >new.min.js

コンパイル済みのjsをnew.min.jsに置き換え、アプリをロードして問題を再現します。n4536のような依存性注入エラーが表示されるはずです。

エディターが非常に長い行で素晴らしい場合は、new.min.jsを読み込むだけで、n4536を探すことができます。

そうでない場合、これは問題に関するコンテキストを印刷するために動作します。 egrep -o '.{199}n4536.{99}' new.min.js

7
ark

Angularのインジェクターには、依存関係を解決する3つの方法があります。

1。関数の引数名から依存関係を推測する。これは、すべての角度の例で最も使用されています。

app.controller('MyController', function($scope, MyService) { ... });

この場合、インジェクターは関数を文字列としてキャストし、引数名を解析し、その名前に一致するサービス/工場/その他を探します。

2。インライン注釈。次の構文にも遭遇する可能性があります。

app.controller('MyController', ['$scope', 'MyService', function($scope, MyService) { ... }]);

この場合、必要な依存関係の名前を明示的に指定するため、インジェクターがはるかに簡単になります。名前は引用符で囲まれ、jsミニファイアーはコード内の文字列を変更しません。

。プロパティとしてのインライン注釈。コントローラーを関数として定義する場合、特別なプロパティ$inject

function MyController($scope, MyService) {...}
MyController.$inject = ['$scope', 'MyService'];

この場合、依存関係も明示的に指定します。

私の推測では、あなたはソリューションを使用していません。 1.ミニファイヤが暗黙的に定義された依存関係の名前を変更すると、インジェクターは関数の依存関係を認識しなくなります。これを克服するには、依存関係に注釈を付ける第2または第3の方法を使用する必要があります。

6
package

どこを見るべきかわからない場合、これらのDI問題をデバッグするための優れた方法はないように見えますが、私は私のものが明白な場所ではないという感覚を持っていました...そしてそれは:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(($rootScope, $location) -> $rootScope.location = $location)

する必要がありました:

App.Services = angular.module('spokenvote.services', ['ngResource', 'ngCookies'])
    .config(servicesConfig)
    .run(['$rootScope', '$location', ($rootScope, $location) -> $rootScope.location = $location])
3
Kim Miller