42

Angular 1.2 ではngRoute別のモジュールであるため、代わりに他のコミュニティ ルーターを使用できますui.router

複数の異なるルーター実装で動作することを目的としたオープンソース モジュールを作成しています。では、どのルーターがロードされているか、または存在するかを確認するにはどうすればよいですか?

モジュールのファクトリ内で次のことを行っていますが、期待どおりに機能しません。

if (angular.module("ngRoute"))
  // Do ngRoute-specific stuff.
else if (angular.module("ui.router"))
  // Do ui.router-specific stuff.

ロードされていないモジュールに対してエラーが発生します。たとえば、アプリが を使用している場合、チェックui.routerのために次のエラーが発生します。ngRoute

キャッチされないエラー: [$injector:nomod] モジュール 'ngRoute' は利用できません! モジュール名のつづりを間違えたか、モジュールをロードするのを忘れました。モジュールを登録する場合は、依存関係を 2 番目の引数として指定してください。

4

7 に答える 7

9

モジュール自体ではなく、サービスをテストします。

// In controller
if($injector.has('$route')){

}
if($injector.has('$state')){

}

// In angular config
if($injector.has('$routeProvider')){

}
if($injector.has('$stateProvider')){

}
于 2015-10-20T20:22:10.310 に答える
6

元の答えは合法です。ただし、代わりに、モジュールを「検索または作成」する必要があるときにこれを書きました。使用例はいくつかありますが、一般的に、ファイルの読み込み順序を気にする必要はありません。これを ... に入れるかinitialModules.js、すべての個々のサービス/ディレクティブ ファイルの先頭を次のようなもので始めることができます。この小さな機能は、私にとって魅力のように機能します。

var initialModules = [
  {name: 'app.directives', deps: ['ui.mask']},
  {name: 'app.services'},
  {name: 'app.templates'},
  {name: 'app.controllers'}
];

initialModules.forEach(function(moduleDefinition) {
  findOrCreateModule(moduleDefinition.name, moduleDefinition.deps);
});

function findOrCreateModule(moduleName, deps) {
  deps = deps || [];
  try {
    angular.module(moduleName);
  } catch (error) {
    angular.module(moduleName, deps);
  }
}


///// OR... in like "myDirective.js"
findOrCreateModule('app.directives').directive('myDirective', myDirectiveFunction);
于 2015-08-11T23:25:33.637 に答える
1

名前を配列に格納するように装飾angular.moduleすると、配列にモジュール名が含まれているかどうかを確認できます。

angular.module を装飾する

SO に関する @dsfq の回答を参照してください。

これは、angular がロードされた後、angular モジュールのロードを開始する前に行う必要があります。

モジュールを確認する

if(angular.modules.indexOf("ngRoute") > -1) ...

于 2016-07-01T09:29:48.720 に答える
0

より良い解決策は、モジュールの作成時にチェックを行うことです。コールバックを追加するには、ユーティリティ関数が必要です。

//create a utility function to add a callback to object methods    
//here we are making it a method of the underscore or lowdash object
//but it could be added to the angular global object or anything else
_.addCallBack = function (obj, originalMethodName, callBackMethod, context){
            var fnOriginal = obj[originalMethodName],
                outcome;

            context = context || obj;

            obj[originalMethodName] = function () {
                var outcome = fnOriginal.apply(this, arguments);

                callBackMethod.apply(this, arguments);

                return outcome;
            };
};

_.addCallBack(angular, "module", function(sModuleName, asDependencies){
    if(_.contains(asDependencies, "ngRoute")){
      //your logic here
      //just loop through if you don't use underscore or lowdash
    }
});
于 2016-03-24T18:31:05.067 に答える
0

ただし、モジュールを自動的にロードまたは作成する問題は、gulp-angular-filesort などでより適切に解決できます。それは本当に完璧に機能します。

gulp-angular-filesort github ページから: モジュールの定義と使用状況に応じて AngularJS アプリ ファイルを自動的に並べ替える

gulp-inject と組み合わせて使用​​して、AngularJS アプリケーション ファイル (スクリプト) を正しい順序で挿入し、Uncaught Error: [$injector:modulerr]をすべて取り除きます。

免責事項:私はgulp-angular-filesortと提携していません。私はそれを多くの利益のためにのみ使用しています。

于 2015-09-24T07:58:54.947 に答える
0

AngularJS 1.6.3 以降には、$injector サービスを介してモジュールがロードされているかどうかを確認する方法があります。

また、1.6.7 で追加されたのは、新しいモジュールをロードする機能です。

于 2018-02-19T21:48:59.250 に答える