Функция ссылки вызывается только один раз, когда директива получает визуализацию.
Это означает, что когда ваш html был визуализирован в первый раз, тогда только функция была вызвана. И так оно и работало. Когда URL изменяется, вам необходимо, чтобы слушатели обновлялись в соответствии с изменениями.
У него не будет прямых подключений к URL-адресу.
Вам необходимо создать прослушиватель на $ locationChangeSuccess событие в функции связи. Это должно сделать вашу работу.
Проверьте документацию here. Найдите эту функцию там. Тогда, когда вы меняете свой URL-адрес, он будет вызываться, и изменения будут выполнены. Ваша директива становится как:
myApp.directive('locationClass', function ($location, $rootScope) {
return {
restrict : 'A',
link: function (scope, element) {
$rootScope.$on('$locationChangeSuccess', function() {
var currentLocation = $location.path();
var formatCurrentLocation = currentLocation.replace(/\//g, " ");
//console.log(currentLocation);
element.addClass(formatCurrentLocation);
});
}
}
UPDATE с целью классов поворотных:
Вы можете использовать переменную области действия вместо этого. Мы можем просто иметь переменную для хранения класса и поместить переменную в html. Проверьте значение locationClass в html.
Так что ваш HTML будет как:
<html ng-app="myApp" ng-controller="headerCtrl as header" location-class class="{{locationClass}}">
и ваша директива, мы изменяем как:
myApp.directive('locationClass', function ($location, $rootScope) {
return {
restrict : 'A',
link: function (scope, element) {
$rootScope.$on('$locationChangeSuccess', function() {
var currentLocation = $location.path();
var formatCurrentLocation = currentLocation.replace(/\//g, " ");
scope.locationClass = formatCurrentLocation;
});
}
}
Так что теперь каждый раз, когда вы меняете свое местоположение, когда изменение прошло успешно, то переменная будет обновляться по атрибуту класса, а ваш html будет иметь новый класс. Вам не нужно удалять старый класс вручную.
Я думаю, что это решит проблему, а также это лучший способ делать вещи. Мы не хотим напрямую обращаться к DOM, если это не необходимо в AngularJS. Если переменная может это сделать, мы это делаем.
UPDATE 2: (если вы хотите использовать часы):
Мы можем держать часы на location.path() и использовать также для отслеживания имени класса.
myApp.directive('locationClass', function ($location, $rootScope) {
return {
restrict : 'A',
link: function (scope, element) {
scope.$watch('$location.path()', function(currentLocation) {
var formatCurrentLocation = currentLocation.replace(/\//g, " ");
scope.locationClass = formatCurrentLocation;
});
}
}
Но все же я бы порекомендовал вам отправиться к слушателю с успехом изменения местоположения. Причина в том, что часы тяжелые и будут срабатывать каждый раз, когда область становится грязной (означает почти каждый раз, если область видимости находится на теле), тогда как прослушиватель событий вызывает функцию только тогда, когда URL-адрес будет изменен. Вы можете поместить консоль внутри функции, чтобы ее проверить и проверить.
Когда это необходимо обновить? когда изменяется свойство области видимости? – aw04
при обновлении url – sani