破壊前のアニメーションを処理するための私の推奨方法は、 を使用することEm.Evented
です。ビューの破棄を開始するメソッドまたはアクションで呼び出されるイベントをビューにリッスンさせ、イベントによってトリガーされたメソッドが完了するまで破棄を遅らせます (実行ループを使用)。例えば:
SomeView = Em.View.extend({
_listen: function() {
this.get('controller').on('closeChildView', this, this.hide);
}.on('willInsertElement'),
hide: function() {
this.$().fadeOut(this.get('controller.duration'));
}
});
そして、コントローラーで:
Em.ObjectController.extend(
Em.Evented, { // Important mixin!
duration: 500,
actions: {
removeSomeChildView: function() {
this.trigger('closeChildView');
Em.run.later(this, function() {
// Then do the stuff to destroy the view here.
}, this.get('duration'));
}
}
});
または、ビューでメソッドを使用してthis.removeFromParent()
、ビューの非表示と削除を統合することもできます。
破棄がビュー自体で実際に開始された場合は、破棄メソッドを呼び出す前にこれらの同じ原則を使用.on('willDestroyElement')
し、ビューが削除された後にコールバックが必要な場合にコントローラーまたはルートにアクションを送信するために使用できます。
破棄前のアニメーションは、ビュー要素を遷移するメソッドを実行this.$().hide
しdidInsertElement
てから使用することで、同じ方法で実行できます。show()
JS と CSS の遷移時間の調整
すべてのトランジションの一部を CSS で行う場合、CSS と JS の間のトランジション時間が一致していることを確認する必要があります。これはとても簡単です。ビューで、CSS トランジションがビューの要素で行われることを確認してから、次のようにします。
SomeView = Em.View.extend({
transitionDuration: Em.computed.alias('controller.transitionDuration'),
setTransitionDuration: function() {
var ms = parseFloat(this.$().css('transition-duration')) * 1000; // In milliseconds
if (ms) {
this.set('transitionTime', ms);
}
}.on('didInsertElement'),
});
これにより、ビューとコントローラーの遷移時間が更新され、CSS に記述したものと一致します。コントローラーで指定しtransitionDuration
た値はフォールバック値であり、デフォルトの JS をオーバーライドする前に検証を行う必要がある場合は、上記のメソッドに をtransitionDuration
追加できます。if ()
transitionDuration