ネストされたコメントのリストを使用して 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();
}
};
}]);