更改视图的模型时,更换模型或创建新视图更好吗?

Ski*_*ick 17 backbone.js

我的Backbone应用程序中有一个电子邮件视图.它目前在view我的控制器的动作中实例化.它有点像这样:

routes: {
  'email/:id': email
},

//...

email: function (id) {
  var email = new Email({
    id: id
  });
  this.emailView = new EmailView({
    model: email
  });
  email.fetch();
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是,如果我访问一封电子邮件,然后是另一封电子邮件,我最终会创建两个单独EmailView的邮件.这意味着,例如,其中的删除链接EmailView绑定到两个单独的Email模型,因此单击删除将删除两者(不是一件好事).

我正在寻找两种解决方案.在一个,我缓存EmailView,并更新其模型.那么问题是我必须重新绑定eventsin EmailView.

另一种解决方案EmailView是在我现在创建一个新的解决方案,但EmailView.el在替换之前解开旧的事件.

我是以正确的方式来做这件事的吗?有没有更好的方法来处理这种情况?提前干杯.

bra*_*ing 3

为每个模型实例创建一个单独的视图实例。每次您访问新电子邮件时,请丢弃旧视图并使用新电子邮件实例创建新视图。

如果我猜的话,您可能拥有的是左侧的列表视图和右侧的编辑器。您从左侧列表中选择电子邮件,并且希望电子邮件正文显示在右侧。

您确实需要大约 5 个视图类。

PageView
    has_one EmailCollectionView on left
    has_one EmailEditorView on right

EmailCollectionView
    has_many EmailSummaryViews as vertical list

EmailEditorView
    has_one EmailView centered
Run Code Online (Sandbox Code Playgroud)

当您单击 EmailCollectionView 时,您会触发一个由 EmailEditorView 拾取的事件,该事件会丢弃 EmailView 的旧实例并呈现 EmailView 的新版本

无论如何,类似的事情

  • 我会完全按照 Bradgonesurfing 的说法去做。当你处置它时,你只需要确保在你看来做了两件事。在视图上调用 this.remove() 。remove() 由 Backbone.View 提供,它将取消绑定视图所附加的所有 DOM 事件。然后,您需要取消绑定视图已订阅的任何模型事件(例如 this.model unbind(...))。 (2认同)