В приложението, което създавам, имам заглавие, което се показва на екрана. Той е обвързан със свойство в моя обхват. Използвам 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
куки. Благодаря за помощта.