Backbone.Marionette:将视图关闭,直到关闭之前关闭动画

esc*_*rtz 10 javascript jquery backbone.js marionette

我正在尝试使用Backbone.Marionette设置渲染和关闭ItemView的动画.为了呈现视图,这非常简单:

MyItemView = Backbone.Marionette.View.extend({
   ...
   onRender: function() {
     this.$el.hide().fadeIn();
   }
   ...
});
Run Code Online (Sandbox Code Playgroud)

这将使我的视图在渲染时淡入.但是,让我说我想在结束时淡出我的观点.

beforeClose: function() {
   this.$el.fadeOut();       // doesn't do anything....
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为项目在调用后立即关闭this.beforeClose(),因此动画没有时间完成.

有没有办法,使用现在的Marionette来完成一个闭幕动画?


或者,这是我一直在使用的解决方法:

_.extend(Backbone.Marionette.ItemView.prototype, {
    close: function(callback) {

        if (this.beforeClose) {

            // if beforeClose returns false, wait for beforeClose to resolve before closing
            // Before close calls `run` parameter to continue with closing element
            var dfd = $.Deferred(), run = dfd.resolve, self = this;
            if(this.beforeClose(run) === false) {
                dfd.done(function() {
                    self._closeView();              // call _closeView, making sure our context is still `this`
                });
                return true;
            }
        }

        // Run close immediately if beforeClose does not return false
        this._closeView();
    },

// The standard ItemView.close method.
    _closeView: function() {
        this.remove();

        if (this.onClose) { this.onClose(); }
        this.trigger('close');
        this.unbindAll();
        this.unbind();      
    }
});
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做:

beforeClose: function(run) {
    this.$el.fadeOut(run);      // continue closing view after fadeOut is complete
    return false;
},
Run Code Online (Sandbox Code Playgroud)

我是新手使用Marionette,所以我不确定这是否是最好的解决方案.如果这是最好的方法,我会提交一个拉取请求,但我想更多地考虑一下如何使用其他类型的视图.

这可能会用于其他目的,例如在关闭时请求确认(请参阅此问题)或运行任何类型的异步请求.

思考?

And*_*rle 18

覆盖该close方法是实现此目的的一种方法,但您可以将其写得更短,因为您可以调用Marionettes close方法而不是复制它:

_.extend(Backbone.Marionette.ItemView.prototype, {
    close: function(callback) {
        var close = Backbone.Marionette.Region.prototype.close;
        if (this.beforeClose) {

            // if beforeClose returns false, wait for beforeClose to resolve before closing
            // Before close calls `run` parameter to continue with closing element
            var dfd = $.Deferred(), run = dfd.resolve, self = this;
            if(this.beforeClose(run) === false) {
                dfd.done(function() {
                    close.call(self);
                });
                return true;
            }
        }

        // Run close immediately if beforeClose does not return false
        close.call(this);
    },


});
Run Code Online (Sandbox Code Playgroud)

另一个想法是覆盖remove您的视图方法.因此,您淡出视图元素,然后将其从DOM中删除

remove: function(){
  this.$el.fadeOut(function(){
    $(this).remove();
  }); 
}
Run Code Online (Sandbox Code Playgroud)