2012-11-04 56 views
0

我正在构建一个小型库应用程序,使其具有编程电子书的可视目录。 现在,我在我的BooksViewModel.js文件中添加了一些电子书信息到ko.observableArray中。 稍后,我将实现一个NodeJS应用程序,其中包含保存在MongooseDB中的所有数据并从那里访问它们,但到现在为止,我只是直接从Knockout.js中进行实验。数据过滤的最佳方法

默认情况下,我的图书馆显示我添加的所有书籍,无组织,所以我期待按语言实现“类别”。每个书对象都包含一个语言属性。 我想过滤语言显示的书籍,但我有点困惑如何才能做到这一点的最佳方式。

数组上的书没有组织起来,它们全都放在那里..有些谈到javascript,其他C等等。 起初我想过为每种语言创建一个单独的数组,然后在ViewModel中实现一个方法来选择您所请求的语言的相应数组。

后来,我就implementa的NodeJS API,通过语言,让他们,让说:

GET /languages/C // will get a json corresponding all the books that talks about C 

视图模型可能包含一个方法:

self.findByLanguage = function(lang) { 
    self.books = // GET /languages/:lang 
}; 

但是,这将每次查询数据库。我想最好先加载json的全部书籍,将它们全部保存到客户端的数组中,然后过滤它们。这样只有一个请求会被提出。 我可以有一个包含所有书籍的全局数组,然后用ko.utils.ArrayFilter实现过滤器。

你们认为最好的方法是什么?也许有更好的方法。

在此先感谢!

+0

您不应将所有书籍发送给他们未请求的客户端。这将是很多可能永远不会使用的数据。做过滤服务器端。 –

回答

0

如果“我的编程电子书”是指这个应用程序仅是你的,有查询所有,只有选定的几本书作为数据库负载通常会在这两种情况下接近零之间的琐碎差异。书的数量可能会有几百个。

但是等等,一次加载它们的实际好处是什么?

上升空间存储整个列表的客户端

  • 如果你一直在寻找最多的类别将节省您的数据库负载的几毫秒,只是从改变类别的所有带宽的。

缺点

  • 带宽使用率是可怕的,初始页面加载速度慢给您充足的你不想要的书籍或需要。
  • 您正在使用的数据库系统的速度是重要的优化因素。无论如何,在language上添加索引并且应该立即进行查询。当你使用数组作为数据源时,与'只发送整个数组'相比,这可能不会显示出来。
  • 在多个窗口/浏览器/多个PC上打开页面将需要您将所有更改同步到所有客户端。如果你不这样做,你会有旧的对象,直到你重新加载页面,这正是你应该避免,如果有列表客户端。

如果你打算在本地计算机上或本地网络中运行此,速度应该是一个微不足道的问题,为什么不能让数据库做的工作?如果你不是,速度是一个问题,我个人会认为“我可以非常快地加载类别X”而不是“初始页面加载速度很慢,但是一旦加载了所有内容,速度就会很快”。