【发布时间】:2014-06-13 22:57:15
【问题描述】:
在我正在构建的应用程序中,我在屏幕上显示了一个标题。它绑定到我范围内的一个属性。我正在使用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 钩子的自包含指令相比,对我来说似乎过于hacky。感谢您的帮助。
【问题讨论】:
-
你能发布一个链接到一个简化的 Plunker/Fiddle 来演示这个代码吗?
-
非常基本的示例,但这是我现在拥有的损坏代码:codepen.io/nseegmiller/pen/blyxI
标签: angularjs animation angularjs-directive ng-animate