0

我正在构建一个小型图书馆应用程序,以拥有我的编程电子书的可视化目录。到目前为止,我已将一些电子书信息添加到 BooksViewModel.js 文件中的 ko.observableArray 中。稍后,我将使用保存在 MongooseDB 中的所有数据来实现 NodeJS 应用程序并从那里访问它们,但现在,我只是直接从 Knockout.js 进行试验。

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

阵列上的书籍没有组织,它们都被丢弃在那里..一些关于javascript,其他C等的讨论。起初我想为每种语言创建一个单独的数组,然后在 ViewModel 中实现一个方法来选择您请求的语言的对应数组。

稍后,我将实现一个 NodeJS API,以通过语言获取它们,让我们说:

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

ViewModel 可以包含一个方法:

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

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

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

提前致谢!

4

1 回答 1

1

如果“我的编程电子书”意味着此应用程序仅供您使用,那么查询所有书籍和仅查询选定的少数书籍之间存在细微差别,因为在这两种情况下,数据库负载通常接近于零。书的数量可能是几百本。

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

在客户端存储整个列表的好处

  • 如果您一直在查看大多数类别,那么只需更改类别即可为您节省几毫秒的数据库负载和所有带宽。

缺点

  • 带宽使用很糟糕,初始页面加载速度较慢,给您大量不需要或不需要的书籍。
  • 您正在使用的数据库系统将速度作为重要的优化因素。language无论如何,添加索引和查询应该立即完成。在您使用数组作为数据源时,与“仅发送整个数组”相比,这可能不会显示。
  • 在多个窗口/浏览器/多台电脑上打开页面需要您同步所有客户端的所有更改。如果您不这样做,您将拥有旧对象,直到您重新加载页面,如果拥有列表客户端,这正是您应该避免的。

如果您打算在本地计算机或本地网络中运行它,速度应该是一个小问题,那么为什么不让数据库来完成这项工作呢?如果您不是并且速度是一个问题,我个人会重视“我可以非常快地加载类别 X”而不是“初始页面加载很慢,但一旦加载所有内容就很快”。

于 2012-11-05T01:10:27.110 回答