28

いくつかのルートを定義しました:

angular.module('myApp', [])
  .config('$routeProvider', function($routeProvider) {
    $routeProvider.when('/aaa', { templateUrl: '/111.html' })
                  .when('/bbb', { templateUrl: '/222.html'});
  });

そして、ユーザーがルートを変更したときにルート名を取得したい:

angular.module('myApp')
  .run(['$rootScope', function($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function(scope, current, pre) {
      // how to get current route name, e.g. /aaa or /bbb
      console.log('Current route name: ' + ???);
    }
  }]);

しかし、私はそれを取得する方法がわかりません。は取得できますがtemplateUrl、ルート名は取得できません。


アップデート

より複雑な使用例:

$routeProvider.when('/users/:id', { templateUrl: '/show_user.html' })

現在のパスが次の場合:

/users/12345

一致するはず/users/:idですが、どのルートが一致したかを知り、ルート名を取得するにはどうすればよい/users/:idですか?

4

4 に答える 4

62

$location サービスを挿入して、その path() 関数を利用できます。

angular.module('myApp')
  .run(['$rootScope','$location', '$routeParams', function($rootScope, $location, $routeParams) {
    $rootScope.$on('$routeChangeSuccess', function(e, current, pre) {
      console.log('Current route name: ' + $location.path());
      // Get all URL parameter
      console.log($routeParams);
    });
  }]);

ドキュメントで他の便利な $location メソッドを見つけることができます

アップデート

現在のルート パラメーターの配列が必要な場合は、上記のように $routeParams サービスを挿入するだけです。

于 2013-03-12T07:13:55.953 に答える
8

$location注入する必要はありません$routeParams
使用できますcurrent.$$route.originalPath

app.run(function ($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) {
        console.log(current.$$route.originalPath);
    });
});

単純なルート (:idなどを使用しない) にはこれで十分です。

より複雑なユース ケースでは、 が返され/users/:idます。ただし、パラメーター
を抽出して完全なルートで置き換えることができます。:idcurrent.params.id

app.run(function ($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) {
        var fullRoute = current.$$route.originalPath,
            routeParams = current.params,
            resolvedRoute;

        console.log(fullRoute);
        console.log(routeParams);

        resolvedRoute = fullRoute.replace(/:id/, routeParams.id);
        console.log(resolvedRoute);
    });
});

ルート文字列で何をする必要があるかによって、これはFlekの回答と比較して面倒になる可能性があります(たとえば、複数のパラメーターがある場合)、またはルートパラメーター名にバインドされたくない場合。

また、注:左中括弧のコードに右中括弧がありませ$onん。

2014/01/15 編集

Angularの$$プロパティはプライベートであることが推奨されているようで、コードから直接呼び出すべきではありません。

于 2013-12-25T11:55:47.833 に答える
2

非常にエレガントなソリューションではなく、Chrome DevTools でのみテストしましたが、うまくいくようです:

Object.getPrototypeOf($route.current) === $route.routes['/users/:id];

これを使用したい他の人'/users/:id'は、ルートを定義したときに使用したパターンに置き換えてください。

また、それ以外のパスと一致させたい場合は、単に使用してください$route.routes['null']

免責事項:これは私が見つけた回避策であり、私にとってはうまくいきます。この動作は文書化されておらず、すべてのシナリオで機能するかどうかをテストしていないため、自己責任で使用してください。

于 2015-07-29T17:43:28.497 に答える