在这种情况下使用Knockout.js会更好吗?

时间:2013-01-11 19:36:10

标签: jquery ajax django dom knockout.js

我目前正在使用Django / Python后端开发一个相当大的分析程序,并使用jQuery。

假设我的所有统计数据都基于“Person”的概念。查看概述统计信息后,有人可能需要打开个人Person并查看他们的统计信息。

目前我将AJAX请求发送回我的服务器,Django取出该人,为他们呈现整个DOM树,然后返回它。 jQuery获取返回的<div>并将其添加到文档DOM树中以及任何其他已打开的人员。

所以每个Person都有自己的div,包含所有相同的元素,只有他们的信息。您正在查看的当前人是display:block;而我display:none;任何其他人。需要返回服务器以获取更详细信息的任何元素(例如查看更详细信息的按钮)都使用Django的模板系统进行编码,并给出类似getMoreInformation('myUUID');的内容。我还要注意,我发现自己经常在元素ID中使用UUID,因此如果需要,AJAX可以找到并修改正确的人的信息。

我最近发现了Knockout.js,我想知道在这种情况下使用它是否会更好,并且对速度等有一些担忧。

似乎Knockout.js将是“正确的事情”,因为它提供了后端数据与如何在Javascript(模型到模型)中表示的更好的一对一关系,而不是个人带有id的DOM元素为任何函数传递。更不用说它会大大减少DOM树中的元素数量。

但是,我的主要受众是IE8,我对Knockout.js存在性能问题表示担忧。虽然目前我只是隐藏并显示与您正在调查的人相关的div,但Knockout.js必须遍历所有data-bind并使用Javascript替换其内容。

在这种情况下使用Knockout.js会有什么性能问题?或者他们会这么小,无所谓?很难找到任何基准测试,有没有人在迁移到Knockout.js时经历了较慢的UI? (更少DOM元素+ Knockout.js与更多DOM元素没有在“真实世界”应用程序中的Knockout.js是我正在寻找的东西。)

2 个答案:

答案 0 :(得分:1)

我认为淘汰赛对你来说很棒,记住你可以使用可见的绑定设置display: none所以它不错。此外,根据性能,它可能会比jQuery更好或更好,因为绑定可以直接访问元素,而不需要查询DOM。

如果您的服务器返回html,可能会涉及相当多的工作。您希望它将数据作为JSON返回并在浏览器中构建UI。此外,除非您希望在将各个值加载到视图后进行更新,否则您可能甚至不需要将各个数据位视为可观察数据。

我不明白为什么你认为通过切换到淘汰赛会有更多或更少的DOM元素。 Knockout使用在渲染之前不需要在DOM中的模板。 您当前的实现是将多块html插入到DOM中,而其他所有内容都相同,它们应该是相同的。

答案 1 :(得分:0)

我想发表评论,但评论太长,所以这是一个答案

Optimizing performance of data visualisation web application

我有类似的想法后改变了数据可视化工具;

它过去常常在每次互动时调用服务器,

现在服务器发送大量数据&amp; js正在休息;

我在接收数据时设置了索引(最多170kb未压缩),然后根据用户交互dom被修改(没有显示:无处理,内容被更改或分离;数据存储在javascript数组中而不是html中元素)

结果非常快(我很惊讶);

您必须小心将元素附加到DOM的方式,创建结构良好的对象以访问最少的DOM;

不知道关于淘汰赛的事情,但如果它是大牌的话,那就是imo&amp;具体而言你寻找性能,你自己做更好的算法(它不是那么难,只是将你的数据处理成索引数组,当事件被触发时将被用作 - 即接收时的一个循环,不再是)