Angular ng-animate 1.3.* Причины неожиданного поведения для ng-класса внутри директивы

Я нахожусь в середине перехода от версии 1.2.* К 1.3.*, И я столкнулся с очень странной и критической ошибкой.

В моем приложении у меня очень просто directive содержать template с ng-class (с условием для свойства scope) по какой-то причине он не работает с версией 1.3.*, и он отлично работает с версией 1.2.*.

Посмотрите на этот Plunker, чтобы проиллюстрировать проблему.

это Plunker код с угловой версией 1.2.*, и, как вы можете видеть, работает нормально.

Попробуйте изменить угловую версию (index.html)

<script src="https://code.angularjs.org/1.3.9/angular.js"></script>
    <script src="https://code.angularjs.org/1.3.9/angular-animate.js"></script>
   <!--<script src="https://code.angularjs.org/1.2.28/angular.js"></script>
   <script src="https://code.angularjs.org/1.2.28/angular-animate.js"></script>-->

Обновите страницу, и тогда вы увидите ошибку:
Angular не обновляет ng-класс в соответствии с изменением свойства 'active'.

Я пытался понять, что может быть причиной этой ошибки, и после многих попыток я обнаружил, что 'ngAnimate' Модуль вызывает эту проблему. попробуйте удалить 'ngAnimate' Зависимость (script.js):

  //var app = angular.module('app', ['ngAnimate']);
    var app = angular.module('app', []);

И тогда вы можете видеть, что все в порядке, так 'ngAnimate' Версия 1.3. * вызывает эту проблему.

Так что это ошибка AngularJS, я прав?

Если нет, то что я делаю не так?

3 ответа

Решение

У вас есть какая-то конкретная причина использовать replace вариант в директиве? Если нет, вы можете просто удалить его, и он отлично работает. Ссылка на рабочий плункер с Angular 1.3.9:

http://plnkr.co/edit/jLIS9uJ1PHC64q6nEmtB?p=preview

Документы V1.3.9 сообщают, что replace устарела и очень редко необходима для работы директив, и, по-видимому, в вашем случае это также могло вызвать некоторые проблемы.

Согласно документу replace будет устаревшим в версии 2. Поскольку вы используете Angular 1.3.9, это должно быть хорошо.

Чтобы решить эту проблему, вы можете удалить replace из директивы или еще, если вы хотите использовать replace затем оберните содержимое шаблона директивы, которая имеет ng-transclude в div, как показано ниже

<div><div ng-click='click()' ng-class='{\"{{defaultColorClass}}\" : !active, \"{{activeColorClass}}\": active, \"mousePointer\" : !active}' class='k-content-button-inner-style {{effectClass}} {{externalClass}}' ng-transclude></div></div>

Для получения дополнительной информации см. https://docs.angularjs.org/api/ng/directive/ngTransclude Объяснить replace=true в угловых директивах (устарело).

bensiu: удаление неиспользуемой * переменной {{effectClass}} в template заставит его работать на 1.4.4 в plunker Пример связан с вопросом.

Модифицированный планк тут

* Редактировать: Вероятно, я должен сказать "использование переменной не в области видимости", а не "неиспользованная переменная".

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