web-dev-qa-db-ja.com

Angular js-現在のURLがルートと一致するかどうかを確認します(動的URLパラメータを使用)

私は単にこれを設定しています:

app.config(['$routeProvider',function($routeProvider) {
  $routeProvider
  .when('/asd/:id/:slug',{
    templateUrl:'views/home/index.html',
    controller:'Home',
    publicAccess:true,
    sessionAccess:true
  });

:idおよび:slugは動的パラメーターです。

次に、そのルートをcheck if current url matchesしたいと思います(/asd/:id/:slug

たとえば、URL:asd/5/it-is-a-slug

最も簡単な方法はどれですか?

私はこれを試しました:

$rootScope.$on('$routeChangeStart', function(){ 
   console.log($route.current); 
});

しかし、ページルートを切り替えると、コンソールに何も返されない場合があります

14
itsme

現在のルートでは、正規表現を使用できます。注入$routeサービスを提供し、現在のルートオブジェクトを探索します。つまり、regexpの部分:

$route.current.regexp

これは、それをどのように使用できるかです(動的メソッドを含む現在のメニュー項目をアクティブ化する必要があるかどうかを確認するコントローラーメソッドの例):

$scope.isActive = function (path) {
    if ($route.current && $route.current.regexp) {
        return $route.current.regexp.test(path);
    }
    return false;
};
25
dfsq

あなたはこのようなことを試すことができます:

  $routeProvider.when('/asd/:id/:slug', {
    templateUrl: '/views/template.html',
    controller: 'YourController',
    resolve: {
      data: ['$route', 'SecurityFactory',
        function ($route, SecurityFactory) {

          var id= parseInt($route.current.params.id, 10);
          var slug= $route.current.params.slug;

          SecurityFactory.checkParams(id, slug);
        }
      ]
    }
  });

次にSecurityFactory内で、パラメーターの有効性を確認できます。たとえばRegExpを使用します。

1
Tome Pejoski

あまりエレガントなソリューションではありません。Chrome DevToolsでのみテストしましたが、動作するようです:

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

$ routesサービスのroutesプロパティは、各ルートのパターンにキーが設定されたオブジェクトリテラルのようです。

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

また、otherwiseパスと一致させる場合は、$route.routes['null']を使用します

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

0
Tiborg