如何正确破坏骨干上的观点?

Ang*_*era 1 javascript backbone.js

所以我是骨干的新手,我试图制作单页应用程序,我使用路由来管理某些事情,我想在用户到达另一条路线时删除一个视图

我使用这种方法来破坏视图

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);

}
Run Code Online (Sandbox Code Playgroud)

这也是我的路线元素

Router = Backbone.Router.extend({
        routes: {
            '':'index',
            '#':'index',
            'events/*event' : 'events'
        },
        index: function(){
            this.indexView = new VistaIndex();
        },
        events: function(params) {
            if( this.indexView )
                this.indexView.destroy_view()
            this.eventView = new EventView({currentEvent: params})
        }
    });
Run Code Online (Sandbox Code Playgroud)

这个问题是,如果我这样做应用程序崩溃,所以你建议我做什么:)

Oak*_*ley 5

我是这样做的:

  Backbone.View.extend({
      //some other view stuff here...
      destroy: function () {
          this.undelegateEvents();
          this.$el.removeData().unbind();

          this.remove();
          //OR
          this.$el.empty();
      }
  });
Run Code Online (Sandbox Code Playgroud)

首先,我们要确保删除所有委托事件(events:{"event selector": "callback"}哈希中的事件).我们这样做是为了避免内存泄漏,并且没有神秘的绑定,以后会意外触发.undelegateEvents()是一个Backbone.View原型函数,用于删除视图的委托事件.简单.

接下来,我们要清理悬挂在视图对象中的任何数据,并取消绑定我们绑定在事件哈希之外的任何事件.jQuery提供了一个removeData()函数,允许我们这样做.您也可以将视频链unbind()绑定到事件监听器,不带任何参数从$ el中删除所有以前连接的事件处理程序.this.$el.removeData().unbind();

现在你可能想在这里做两件事之一.您可能希望完全删除视图元素,或者您只想删除在其生命周期中附加到其上的所有子元素.例如,如果您将视图的$ el设置为视图行为完成后应保留的DOM元素,则后者将是合适的

在前一种情况下,this.remove()将删除您的视图元素,它是来自DOM的子元素.

在后一种情况下,this.$el.empty()将删除所有子元素.

如果你想愚弄我的解决方案,请查看这个小提琴. http://jsfiddle.net/oakley349/caqLx10x/

  • 但Backbone的`remove`调用[jQuery的`remove`](http://api.jquery.com/remove/),它将自己处理数据和事件.[jQuery的`empty`](http://api.jquery.com/empty/)也负责处理`el`中的数据和事件.你也错过了一个`stopListening`调用.经验法则:使用`listenTo`,不要将视图绑定到现有的`el`s,并通过调用`remove`进行清理; 如果有孩子要清理,那么在链接到标准`remove`实现之前,重写`remove`来调用`remove`.请参阅[Impossible Backbone Zombies](http://stackoverflow.com/a/33202744/479863). (5认同)