销毁或删除 Backbone.js 中的视图

我目前正在尝试实现一个视图的销毁/删除方法,但我不能得到一个通用的解决方案,以工作的所有视图。

我希望能有一个事件附加到控制器,这样当一个新的请求通过时,它就会破坏以前的视图 那么加载新的视图。

有没有办法不必为每个视图建立一个删除函数就可以做到这一点?

110941 次浏览

Without knowing all the information... You could bind a reset trigger to your model or controller:

this.bind("reset", this.updateView);

and when you want to reset the views, trigger a reset.

For your callback, do something like:

updateView: function() {
view.remove();
view.render();
};

I had to be absolutely sure the view was not just removed from DOM but also completely unbound from events.

destroy_view: function() {


// COMPLETELY UNBIND THE VIEW
this.undelegateEvents();


this.$el.removeData().unbind();


// Remove view from DOM
this.remove();
Backbone.View.prototype.remove.call(this);


}

Seemed like overkill to me, but other approaches did not completely do the trick.

This is what I've been using. Haven't seen any issues.

destroy: function(){
this.remove();
this.unbind();
}

I know I am late to the party, but hopefully this will be useful for someone else. If you are using backbone v0.9.9+, you could use, listenTo and stopListening

initialize: function () {
this.listenTo(this.model, 'change', this.render);
this.listenTo(this.model, 'destroy', this.remove);
}

stopListening is called automatically by remove. You can read more here and here

I think this should work

destroyView : function () {
this.$el.remove();
}

According to current Backbone documentation....

view.remove()

Removes a view and its el from the DOM, and calls stopListening to remove any bound events that the view has listenTo'd.

You could use the way to solve the problem!

initialize:function(){
this.trigger('remove-compnents-cart');
var _this = this;
Backbone.View.prototype.on('remove-compnents-cart',function(){
//Backbone.View.prototype.remove;
Backbone.View.prototype.off();
_this.undelegateEvents();
})
}

Another way:Create a global variable,like this:_global.routerList

initialize:function(){
this.routerName = 'home';
_global.routerList.push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
Backbone.View.prototype.remove.call(_global.routerList[i]);
}