В приложении, которое я создаю, у меня есть заголовок, который отображается на экране. Он привязан к свойству в моей области. Я использую ng-bind-html
, чтобы упростить создание строки заголовка. HTML выглядит примерно так:
<div class="headline slide-and-fade-up" animate-on-change="headline" ng-bind-html="headline"></div>
animate-change
— это директива, которую я пытаюсь написать, чтобы заголовок анимировался при его изменении. Запрошенная анимация предназначена для того, чтобы старая анимация перемещалась вверх и за пределы экрана, а новая перемещалась снизу вверх и занимала место. Я создал совместимую с ng-animate
анимацию под названием slide-and-fade-up
, которая делает то, что я хочу. Поскольку мне нужно анимировать старое значение, уходящее по мере появления нового, мне нужно продублировать элемент и иметь один со старым значением и один с новым в DOM, а затем оставить старый.
Пока моя директива выглядит так:
angular.module('myApp.directives').directive('animateOnChange', ['$animate',
function($animate) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
scope.$watch(attrs.animateOnChange, function(newValue, oldValue) {
if (newValue !== undefined && oldValue !== undefined && newValue !== oldValue) {
$animate.enter(element.clone(), element.parent(), element);
$animate.leave(element);
}
});
}
}
}
]);
У этого есть пара проблем:
- Похоже, что клонированный элемент не имеет «живой» директивы, т. е. он существует в DOM, но на самом деле не запускает этот код, что означает, что анимация запускается ровно один раз, а затем никогда больше.
- Элемент, который входит, имеет в нем старое значение, а элемент, который уходит, имеет в нем новое значение. Я понятия не имею, почему это так, но в основном это точно наоборот
Как я могу закончить эту директиву, чтобы заставить ее делать то, что я хочу? Я заставил его работать, используя ng-if
и наблюдая за изменением данных и включая логическое значение, подождав короткое время, а затем снова включив его. Это сработало, но мне показалось слишком хакерским по сравнению с автономной директивой с $animate
хуками. Спасибо за помощь.