Подтвердить что ты не робот

Как получить имя маршрута при изменении местоположения?

Я определил некоторые маршруты:

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, но не имя маршрута.


UPDATE

Более сложный вариант использования:

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

Если текущий путь:

/users/12345

Он должен соответствовать /users/:id, но как узнать, какой маршрут согласован, и получить имя маршрута /users/:id?

4b9b3361

Ответ 1

Вы можете ввести службу определения местоположения $и использовать ее функцию 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);
    });
  }]);

Другие полезные методы определения местоположения можно найти в docs

UPDATE

Если вы хотите иметь массив ваших текущих параметров маршрута, просто введите услугу $routeParams, как я сделал выше.

Ответ 2

Вам не нужно вводить $location и $routeParams.
Вы можете использовать current.$$route.originalPath

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

Этого достаточно для простых маршрутов (без :id и т.д.).

С более сложным вариантом использования он вернет /users/:id.
Но вы можете извлечь параметр :id из current.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 открывающей скобки.

Изменить 15/01/2014

Похоже, что свойства $$ в Angular считаются закрытыми, и мы не должны называть их непосредственно из нашего кода.

Ответ 3

Не очень элегантное решение, и я тестировал его только в Chrome DevTools, но он работает:

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

Для других, желающих использовать это, просто замените '/users/:id' на шаблон, который вы использовали при определении маршрута.

Также, если вы хотите сопоставить путь, иначе, используйте $route.routes['null']

Отказ от ответственности. Это всего лишь обходной путь, который я нашел и который работает для меня. Учитывая, что это поведение не документировано и что я не тестировал его, чтобы увидеть, работает ли он во всех сценариях, используйте его на свой страх и риск.

Ответ 4

Я думаю, вы можете легко получить путь от current

app.run(function ($rootScope) {
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) {
        console.log(current.originalPath); // Do not use $$route here it is private
    });
});