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

Как определить изменение местоположения

У меня есть контроллер, который показывает меню навигации по страницам. В меню есть массив элементов, и каждый элемент имеет подпись и ссылку. Я также устанавливаю флаг для каждого элемента, который указывает, отображается ли в данный момент соответствующая страница:

module.controller('MenuContr', [
    /******/ '$scope', '$location',
    function ($scope,   $location) {
        $scope.items = [
            {text: 'page 0',
             href: '#/page-0',
             current: $location.path() === '/page-0'},
            {text: 'page 1',
             href: '#/page-1',
             current: $location.path() === '/page-1'}
        ];

в моем шаблоне:

<ul class="menu" ng-controller="MenuContr" ng-cloak>
  <li ng-repeat="item in items" ng-switch on="item.current">
    <span class="current" ng-switch-when="true">{{item.text}}</span>
    <a ng-switch-default ng-href="{{item.href}}">{{item.text}}</a>
  </li>
</ul>

Мне нужно обновить меню при изменении местоположения, как это сделать? Есть ли событие, на которое я могу подписаться?

EDIT: этот контроллер используется в дополнение к контроллерам, определенным на моих маршрутах, и вышеприведенный шаблон помещается над элементом, содержащим директиву ng-view.

4b9b3361

Ответ 1

чтобы ответить на мой собственный вопрос, в моем MenuContr:

        $scope.$on('$routeChangeSuccess', function () {
            var items = $scope.items;
            var path = $location.path();

            for (var i = 0; i < items.length; i++) {
                var item = items[i];
                var href = item['href'];
                item['current'] = !!href && href.substring(1) === path;
            }
        });

Ответ 2

Вы идете к тому же контроллеру при изменении маршрута? Так вы определили в $routeProvider в AppsModule.config? Вы можете передать $routeParams на тот же контроллер, если хотите дополнительную фильтрацию.

Вы инициализировали объект в начале вашего контроллера. Итак, как только ссылка будет изменена, будет вызван тот же самый контроллер, и вам не придется делать что-либо другое. На основе выбранного маршрута элементы будут обновлены.