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

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

//...

email: function (id) {
  var email = new Email({
    id: id
  });
  this.emailView = new EmailView({
    model: email
  });
  email.fetch();
}


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

我正在寻找两种解决方案。在其中之一中,我将缓存EmailView,并更新其模型。然后的问题是,我必须在events中重新绑定EmailView

另一个解决方案是像现在一样创建一个新的EmailView,但是在替换之前将旧的EmailView.el事件取消绑定。

我要这样做正确吗?有没有更好的方法来处理这种情况?提前加油。

最佳答案

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

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

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

PageView
    has_one EmailCollectionView on left
    has_one EmailEditorView on right

EmailCollectionView
    has_many EmailSummaryViews as vertical list

EmailEditorView
    has_one EmailView centered


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

反正这样

10-08 06:42