View的主干变化模型

Posted

技术标签:

【中文标题】View的主干变化模型【英文标题】:Backbone change model of View 【发布时间】:2012-01-25 09:26:07 【问题描述】:

我是 Backbone 的新手,有以下问题:

我有一系列模型。

我有一个显示选项卡的集合视图(包含集合中每个模型的视图)。

我有一个模型的视图(对于内容)。

我有一个带路由的路由器。

我想要实现的是像http://jqueryui.com/demos/tabs/这样的功能

我单击一个选项卡(集合模型),然后想将模型传递给内容视图,可能会更改它并反映集合中的更改。

我想出了四个解决方案:

在路由器中:

'switchCommunity': function(id) 
        // (a) set new model attributes
        this.view.community.model.set(communities.get(id));

        // (b) replace model
        this.view.community.model = communities.get(id);

        // (c) a custom function of the view changes its model
        this.view.community.changeModel(communities.get(id));

        // (d) a new view
        this.view.community = new View(
            model: communities.get(id)
        )

这里的问题是

(a) 不反映模型中的更改 收藏

(b) 不会触发(更改)事件,因为 视图的初始化函数永远不会触发,因为它是 一个全新的模型

(c) 对我来说似乎是个 hack

(d) 每次我单击选项卡时都会创建一个新视图(这是 性能问题?)

这里最好的做法是什么?

【问题讨论】:

我会尝试 (d) - 如果您先删除旧视图,这不会成为性能问题。 in (d) 我覆盖了我的 this.view.community 是否足够,还是必须手动删除? 这应该足够了,只要旧的 dom 元素没有闲置并且绑定了事件监听器,它们就应该被垃圾回收。我会用 firebug 进行验证,但我认为这是正确的。 我总是在我的视图中添加一个 close 方法,在取消绑定所有 bacbone 和 dom 事件后将其从 dom 中删除。 感谢您提出这个非常有用的问题!选项 (d) 也不是一个好的选择,因为如果您的(子)视图上有事件监听器,它们会在创建新的(子)视图时堆积起来 【参考方案1】:

你的一个解决方案几乎可以了:D

这是你想要的:

this.view.community.model.set(communities.get(id).toJSON());

这也会触发 model.on("change")。

【讨论】:

communities.get(id).attributes 也可以工作并且对我来说看起来更干净。【参考方案2】:

为什么你认为 (c) 是一个 hack?这似乎是一个封装旧模型的解除绑定并连接新模型的好地方。

【讨论】:

【参考方案3】:

Backbone.Marionette 插件为您的问题提供了一种简化的解决方案。

它提供了应用程序初始化、视图管理和事件聚合的功能。

本质上,它消除了隐藏和显示多个视图的痛苦。

您可以阅读此blog post 以了解更多信息。

【讨论】:

当然,但请记住该插件是相当新的,在不久的将来可能会更改几次【参考方案4】:

简短的回答是您应该使用 d。是的,性能不佳,但除非您注意到用户界面速度变慢,否则您不必太担心。您应该编写一些代码 1. 始终有效 2. 编写代码不需要很长时间,这样您就可以继续编写其他更重要的功能。

如果/当您需要更多性能时,您可以花额外的时间来做 c。要成为最高性能,您不应该破坏和重新渲染模板。您应该使用 jquery 手动查找 DOM 上的元素并将它们替换为新模型。当你打电话时:

view.$el = _.template(string, model); 

这是非常少的代码,但对浏览器来说有很多工作。用新模型替换 DOM 会更高效。

如果您需要更高的性能,您可以使用对象池。我一直在为骨干网开发一个 PerfView,它实现了很多优化。 https://github.com/puppybits/BackboneJS-PerfView 代码中有 cmets 有很多最佳实践来保持最佳浏览器性能。

【讨论】:

以上是关于View的主干变化模型的主要内容,如果未能解决你的问题,请参考以下文章

主干:更改事件后更新模型

在主干视图中显示两个模型?

如何加载多个依赖的主干模型?

模型属性未统一命名的主干集合和模板

TSLint:在拥有模型含义之外调用主干 get()

如何从车把模板访问主干模型的计算字段?