我正在构建一个带有嵌套评论列表的 Ionic 应用程序。我需要将回复动画化为子元素并保留状态。目前我正在使用带有 jQuery slideToggle 的简单指令,但这不会保留状态(并且不是“Angular 方式”)。
Shlomi Assaf 的这个幻灯片动画示例是我需要的一个很好的开始,但它不处理嵌套元素。我创建他的 CodePen 项目的嵌套版本来演示这个问题。
我不确定是否应该修改动画函数以处理嵌套元素,或者我的控制器是否应该在子元素动画时(或完成后)调用祖先元素上的动画。
协助表示赞赏。这是使用原生 AngularJS 指令的 HTML 的基础:
<button ng-click="slideToggle1=!slideToggle1">Click Me</button>
<div class="slide-toggle" ng-show="slideToggle1"> ... </div>
这是原始动画功能:
app.animation('.slide-toggle', ['$animateCss', function($animateCss) {
var lastId = 0;
var _cache = {};
function getId(el) {
var id = el[0].getAttribute("data-slide-toggle");
if (!id) {
id = ++lastId;
el[0].setAttribute("data-slide-toggle", id);
}
return id;
}
function getState(id) {
var state = _cache[id];
if (!state) {
state = {};
_cache[id] = state;
}
return state;
}
function generateRunner(closing, state, animator, element, doneFn) {
return function() {
state.animating = true;
state.animator = animator;
state.doneFn = doneFn;
animator.start().finally(function() {
if (closing && state.doneFn === doneFn) {
element[0].style.height = '';
}
state.animating = false;
state.animator = undefined;
state.doneFn();
});
}
}
return {
addClass: function(element, className, doneFn) {
if (className == 'ng-hide') {
var state = getState(getId(element));
var height = (state.animating && state.height) ?
state.height : element[0].offsetHeight;
var animator = $animateCss(element, {
from: {
height: height + 'px',
opacity: 1
},
to: {
height: '0px',
opacity: 0
}
});
if (animator) {
if (state.animating) {
state.doneFn =
generateRunner(true,
state,
animator,
element,
doneFn);
return state.animator.end();
} else {
state.height = height;
return generateRunner(true,
state,
animator,
element,
doneFn)();
}
}
}
doneFn();
},
removeClass: function(element, className, doneFn) {
if (className == 'ng-hide') {
var state = getState(getId(element));
var height = (state.animating && state.height) ?
state.height : element[0].offsetHeight;
var animator = $animateCss(element, {
from: {
height: '0px',
opacity: 0
},
to: {
height: height + 'px',
opacity: 1
}
});
if (animator) {
if (state.animating) {
state.doneFn = generateRunner(false,
state,
animator,
element,
doneFn);
return state.animator.end();
} else {
state.height = height;
return generateRunner(false,
state,
animator,
element,
doneFn)();
}
}
}
doneFn();
}
};
}]);