javascript – 在Backbone.js中处理视图和模型对象

在不需要模型/视图实例时,哪种是最有效的方式?

通常,我把所有的逻辑在控制器/路由器。它是一个决定,应该创建什么样的视图,以及应该为他们提供什么模型。通常,有一些处理程序函数,对应于不同的用户操作或路由,我在每次当处理程序被执行时创建新的视图实例。当然,这应该消除我以前存储在视图实例中的任何东西。但是,在某些情况下,某些视图自己保留DOM事件处理程序,并且它们不会正确解除绑定,导致这些实例保持活动。我希望如果有一个正确的方法来销毁视图实例,当例如他们的el(DOM表示)被分离或抛出的DOM

你在正确的道路上。你应该有一个控制视图生命周期的对象。我不喜欢把这个在我看来。我喜欢为此创建一个单独的对象。

你需要做的事情,是在必要时解除事件的绑定。为此,最好在所有视图上创建一个“关闭”方法,并使用控制所有内容生命周期的对象来始终调用close方法。

例如:


  function AppController(){
    this.showView = function (view){
      if (this.currentView){
        this.currentView.close();
      }
      this.currentView = view;
      this.currentView.render();
      $("#someElement").html(this.currentView.el);
    }
  }

在这一点上,你将设置你的代码只有一个AppController的实例,你总是从你的路由器或任何其他需要在#someElement部分显示视图的代码调用appController.showView(…)的屏幕。

(我有另一个非常简单的骨干应用程序使用“AppView”(骨干视图运行应用程序的主要部分),这里:http://jsfiddle.net/derickbailey/dHrXv/9/)

默认情况下,视图上不存在close方法,因此您需要为每个视图自行创建一个。在close方法中应该总是有两件事情:this.unbind()和this.remove()。除了这些,如果您将视图绑定到任何模型或集合事件,您应该在close方法中解除绑定。

例如:


  MyView = Backbone.View.extend({
    initialize: function(){
      this.model.bind("change", this.modelChanged, this);
    },

    modelChanged: function(){
      // ... do stuff here
    },

    close: function(){
      this.remove();
      this.unbind();
      this.model.unbind("change", this.modelChanged);
    }
  });

这将从DOM(通过this.remove()),视图本身可能引发的所有事件(通过this.unbind())和视图从模型绑定的事件通过this.model.unbind(…))。

http://stackoverflow.com/questions/7379263/disposing-of-view-and-model-objects-in-backbone-js

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – 在Backbone.js中处理视图和模型对象