我尝试在连接不同的插座之间进行一些动画转换。我知道有类似willInsertElement
,didInsertElement
或willDestroyElement
on 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()
})
它似乎工作正常,但这可能是非常糟糕的设计。有没有更好的方法来达到类似的效果?或者我完全错了,应该从非常不同的角度看待问题?例如,在 View 内制作动画,其中包含另一个 View 等?