私は、異なるコンセントを接続する間にいくつかのアニメーション化されたトランジションを作成しようとしています. willInsertElement
、didInsertElement
またはwillDestroyElement
オーバーライドできるViewクラスのようなメソッドがあることは知っていますが、要素の追加または特に削除を延期することはできません。私は他のメソッドをオーバーライドしようとしていましたが、ビュークラスはそれがどのように機能するかを理解するのが複雑すぎます. 私はいくつかのアイデアを思いつきました:
AnimationHelper = Ember.Object.extend({
isPreviousViewFadedOut:false,
nextViewToFadeIn:null,
triggerManually: true,
setNextViewToFadeIn:function (view) {
if (this.nextViewToFadeIn) {
if (this.hasObserverFor('isPreviousViewFadedOut')) {
this.removeObserver('isPreviousViewFadedOut', this.nextViewToFadeIn, 'fadeInCallback');
}
}
this.nextViewToFadeIn = view;
this.addObserver('isPreviousViewFadedOut', this.nextViewToFadeIn, 'fadeInCallback');
}
});
AnimatedView = Ember.View.extend({
didInsertElement:function () {
this.$().hide();
if (AnimatedView.aHelper.get('triggerManually')) {
AnimatedView.aHelper.set('isPreviousViewFadedOut', true);
this.fadeInCallback();
//next time we don't want call fadeInCallback manually
AnimatedView.aHelper.set('triggerManually', false);
} else {
AnimatedView.aHelper.setNextViewToFadeIn(this);
}
},
fadeInCallback:function () {
if (AnimatedView.aHelper.get('isPreviousViewFadedOut')) {
this.$().fadeIn(1000);
}
},
willDestroyElement:function () {
AnimatedView.aHelper.set('isPreviousViewFadedOut', false);
var clone = this.$().clone();
this.$().replaceWith(clone);
var that = this;
clone.fadeOut(1000, function () {
$(this).remove();
if (AnimatedView.aHelper.nextViewToFadeIn == that) {
AnimatedView.aHelper.removeObserver('isPreviousViewFadedOut',
AnimatedView.aHelper.nextViewToFadeIn, 'fadeInCallback');
} else {
AnimatedView.aHelper.set('isPreviousViewFadedOut', true);
}
});
}
})
AnimatedView.reopenClass({
aHelper:new AnimationHelper()
})
正常に動作しているように見えますが、これはおそらく非常に悪い設計です。同様の効果を達成するためのより良い方法はありますか?それとも、私は完全に間違っていて、問題を非常に異なる視点から見るべきでしょうか? たとえば、別のビューなどをラップするビュー内でアニメーションを行いますか?