Как определить изменение местоположения
У меня есть контроллер, который показывает меню навигации по страницам. В меню есть массив элементов, и каждый элемент имеет подпись и ссылку. Я также устанавливаю флаг для каждого элемента, который указывает, отображается ли в данный момент соответствующая страница:
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
.
Ответы
Ответ 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 на тот же контроллер, если хотите дополнительную фильтрацию.
Вы инициализировали объект в начале вашего контроллера. Итак, как только ссылка будет изменена, будет вызван тот же самый контроллер, и вам не придется делать что-либо другое. На основе выбранного маршрута элементы будут обновлены.