Próbuję wykonać animowane przejścia między łączeniem różnych gniazd. Wiem, że istnieją metody takie jak willInsertElement
, didInsertElement
lub willDestroyElement
w klasie Widok, które można przesłonić, ale nie można odroczyć dołączania, a zwłaszcza usuwania elementu. Próbowałem zastąpić inne metody, ale widok klasy jest skomplikowany, aby zrozumieć, jak to działa. Wpadłem na pewien pomysł:Animowane przejścia widoków. Jak odroczyć usunięcie lub wstawienie elementu?
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()
})
Wydaje się działać prawidłowo, ale jest to prawdopodobnie bardzo zły projekt. Czy istnieje lepszy sposób osiągnięcia podobnego efektu? a może całkowicie się mylę i powinienem spojrzeć na problem z zupełnie innej perspektywy? na przykład czy animacje w widoku, które owija inny widok itp.?
Ta prezentacja może być pomocna: https://speakerdeck.com/machty/ember-meetup –