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

Можно ли "следить" за изменениями атрибутов?

Можно ли "смотреть" на изменения ui в директиве? что-то вроде этого:

.directive('vValidation', function() {
    return function(scope, element, attrs) {
        element.$watch(function() {
            if (this.hasClass('someClass')) console.log('someClass added');
        });
    }
})
4b9b3361

Ответ 1

Да. Вы можете использовать attr.$observe, если вы используете интерполяцию по атрибуту.

Но если это не интерполированный атрибут, и вы ожидаете, что он будет изменен из другого места в приложении (что крайне не рекомендуется, прочитайте Common Pitfalls), чем вы можете $watch вернуть функцию:

scope.$watch(function() {
    return element.attr('class'); 
}, function(newValue){
    // do stuff with newValue
});

Во всяком случае, вероятно, что лучшим вариантом для вас будет изменение кода, который изменяет класс элемента. Какой момент он изменится?

Ответ 2

attrs.$observe('class', function(val){});

Ответ 3

Вы также можете просмотреть переменную в контроллере.

Этот код автоматически скрывает панель уведомлений после того, как какой-либо другой модуль отобразит сообщение обратной связи.

HTML:

<notification-bar
    data-showbar='vm.notification.show'>
        <p> {{ vm.notification.message }} </p>
</notification-bar>

ДИРЕКТИВА:

var directive = {
    restrict: 'E',
    replace: true,
    transclude: true,
    scope: {
        showbar: '=showbar',
    },
    templateUrl: '/app/views/partials/notification.html',
    controller: function ($scope, $element, $attrs) {

        $scope.$watch('showbar', function (newValue, oldValue) {
            //console.log('showbar changed:', newValue);
            hide_element();
        }, true);

        function hide_element() {
            $timeout(function () {
                $scope.showbar = false;
            }, 3000);
        }
    }
};

ДИРЕКТИВНЫЙ ШАБЛОН:

<div class="notification-bar" data-ng-show="showbar"><div>
    <div class="menucloud-notification-content"></div>