AngularJS, Animate при изменении: директива $watch not call

Я создаю живое веб-сокет-приложение, которое требует привлечения внимания пользователей при изменении значения.

Следующая директива используется в нескольких местах на одной странице:

<span class="badge" animate-on-change animate-class="highlightWarning" animate-watch="totalAnswers">{{totalAnswers}}</span>

а также

<div animate-on-change animate-class="colorWarning" animate-watch="rq.answer"
                                 ng-switch="question.type"
                                 ng-repeat="rq in recentResponse.answers"
                                 ng-if="rq.question == question.id">

Теперь rq.answer редко меняется, но меняется каждый раз, когда меняется фактическое значение. IE: работает правильно

К сожалению, первый не работает после первого вызова (при загрузке страницы), но {{totalAnswers}} показывает визуальное изменение. Модель определенно обновляется, но $watch не вызывается. Почему это?

.directive('animateOnChange', function ($timeout) {
    return {
      scope: {
        animateClass: '@',
        animateTime: '@',
        animateWatch: '@',
        animateCollection: '@'
      },
      link: function (scope, element, attr) {
        function call() {
          element.addClass(scope.animateClass);
          $timeout(function () {
            element.removeClass(scope.animateClass);
          }, scope.animateTime || 1000); // Could be enhanced to take duration as a parameter
        }

        if (scope.animateWatch)
          scope.$watch(scope.animateWatch, function (nv, ov) {
            call();
          }, true);
        if (scope.animateCollection)
          scope.$watchCollection(scope.animateCollection, function (nv, ov) {
            call();
          });
      }
    };
  })
;

1 ответ

Решение

Вам нужно изменить первый аргумент на $watch, чтобы быть функцией, возвращающей вашу переменную вместо самой переменной:

scope.$watch(function () {
               return scope.animateWatch; }, 
             function (nv, ov) {
               call(); }, 
             true);

Посмотрите здесь на документы в разделе часов.

Другие вопросы по тегам