7

tl; dr:我想知道是否有很多(目前为 100+,可能高达 1000/2000 或更多)主干视图(作为表格的一个单元格)是否太重

我正在进行的项目围绕着一个规划视图。每个用户有一行,覆盖一天 6 小时,每个小时分为 4 个 1500 万个插槽。此计划用于在单击插槽时添加“预订”,并且应该处理正确插槽的悬停,以及在无法进行预订时处理 - 即。防止用户单击“不可用”插槽。

一个槽点不能点击的原因有很多:用户此时不可用,或者用户处于预约状态;或者应用程序需要在两个预订之间“强制”一个延迟槽。保留(一个 div)在一个槽(表格的一个单元格)中呈现,并且通过玩弄尺寸,悬停正确数量的槽。

所有这些屏幕都由主干处理。所以对于我悬停的每个插槽,我需要检查我是否可以在这里进行预订。到目前为止,我通过玩弄data槽上的属性来使用它:当添加一个预留对象时,所覆盖的槽“通过(除其他外)预留对象(主干视图对象)进行了增强。

但在某些情况下,我现在不太了解,它混淆了,当保留视图被删除时,插槽没有“清理”:前一个class没有正确重置。这可能是我做错了或做得不好,但这只会变得更重;我想我应该在这里使用另一类 Backbone 视图,但我担心槽数和视图对象的数量会很高并导致性能问题。我对 js 性能一无所知,所以我想在上火车之前得到一些反馈。关于如何做到这一点的任何其他建议也将受到欢迎。

谢谢你的时间。如果这还不够清楚,请告诉我,我会尝试改写它。

4

3 回答 3

8

我们有一个非常复杂的backbone.js 应用程序,在给定时间可能有数千个视图。我们的瓶颈主要在于未正确删除的视图的内存泄漏或不必要地重新渲染视图的事件驱动渲染。也就是说,实际观看次数似乎并没有太大影响。主干视图非常轻量级,因此只要您没有绑定太多事件,就不是什么大问题。

您可能会遇到性能问题,但视图可能不是问题。

但是,如果您确实使用了数千个视图,您可能想要做的是将初始渲染隐藏到一个大的“.html()”调用中。您可以通过根据视图的 cid 给每个视图元素一个 id 来做到这一点,然后连接视图的 html 字符串,然后在每个视图上使用 setElement 再次找到它的元素。

于 2012-08-01T20:22:34.150 回答
2

也许这有点帮助:
https ://stackoverflow.com/a/7150279/1067061

顺便说一句:我喜欢你的头像;)

于 2012-08-01T13:37:39.520 回答
0

主干处理一切是浏览器性能最低的方式。如果速度不够快,您需要停止创建和销毁模板。缓存模板几乎没有任何帮助。

与其调用渲染函数,不如将变量保存到 jquery 选择器中,当模型更改时,使用缓存的选择器更新 DOM。这将为您带来最大的性能飞跃。

$title = null,
init = function(){ $title = this.$el.find('h1'); },
onTitleChange = function(event){ $title.html(event.value) }

我正在研究一个高性能的主干视图。它可以以超过 120FPS 的速度渲染包含 1,000,000 个模型的集合。代码在 Github 上。https://github.com/puppybits/BackboneJS-PerfView还有很多其他的优化可以做。如果您查看 PrefView,它对大多数优化都有评论。

于 2013-10-22T03:49:45.690 回答