在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
集合在第一章我们提到了 Meteor 的核心功能, 那就是服务器端和客户端的自动数据同步。 在这一章我们要仔细了解一下它是如何运作的,以及研究那个让它得以运行的关键技术: Meteor 集合(Collection)。 集合是一个特殊的数据结构,它将你的数据存储到持久的、服务器端的 MongoDB 数据库中,并且与每一个连接的用户浏览器进行实时地同步。 我们想让我们的 post 永久保存并且要在用户之间共享,所以我们一开始要新建一个叫做 我们现在做一个社交新闻应用, 所以第一件事儿就是做一个人们贴上来的帖子的连接列表。 我们叫它 'post' 很自然, 我们需要把它们存起来。 Meteor 捆绑了 MongoDB 运行在服务器上作为持久化存储。 因此,尽管一个用户在浏览器上有各种状态(比如他们正在阅读哪一页, 或者正在输入那一条评论), 而服务器上,尤其是 Mongo,保存的是永久保留的一致数据。 说到一致, 我们是指对于所有用户来说都是一样的数据: 每个用户也许在看不同的页面, 但是帖子 Post 的主列表对所有用户来说却始终是一样的。 这些数据在Meteor中被存储在集合(Collection)中。 集合是一种特殊的数据结构, 通过发布(publications)和订阅(subscriptions)机制把数据实时同步上行或者下行到连接着的各个用户的浏览器或者Mongo数据库中。让我们看看如何做到的。 我们希望我们的帖子Post可以持久存储并分享给用户们, 所以我们一开始就要建立一个叫
代码所在的目录既不是 要 Var 还是不要 Var?在 Meteor 中,关键字 存储数据网络应用有三种基本方式保存数据,各种方式有不同的角色:
Meteor 使用所有三种方式,有时会从一个地方同步数据到另一个地方(我们会马上看到)。话虽如此,数据库仍然是包含数据主副本的“规范化的”数据源。 客户端与服务器不在 在服务器,集合有一个任务就是和 Mongo 数据库联络,读取任何数据变化。 在这种情况下,它可以比对标准的数据库。 在客户端,集合是一个安全拷贝来自于实时一致的数据子集。客户端的集合总是(通常)透明地实时更新数据子集。 Console,Console 与 Console在这一章,我们开始使用浏览器控制台,不过不要和终端、Meteor Shell 或者 Mongo Shell 搞混了。 现在对它们做个比对。 终端命令行
浏览器控制台
Meteor Shell
Mongo 外壳程序 (Mongo Shell)
注意在各种情况下你都不需要敲提示符( 服务器端的集合在服务器端,集合可以像 API 一样操作 Mongo 数据库。在服务器端的代码,你可以写像 如果想直接看看 MongoDB 数据库,可以打开第二个终端窗口(这时候 Meteor 还在第一个终端窗口继续运行呢),在你应用的目录,输入命令
Meteor.com 上的 Mongo注意如果你把应用部署在 *.meteor.com 上,你一样可以通过 而且你还可以输入 Mongo 的语法由于借鉴了 Javascript 的语法所以十分熟悉。我们现在在 Mongo 外壳里不做过多的数据操作,不过我们可以随时来这里检查数据确保他们正常存在。 客户端集合客户端的集合更加有趣。当你在客户端申明 有一点我们必须要明白,因为这是 Meteor 工作的一个基础: 通常说来,客户端的集合的数据是你 Mongo 数据库的所有数据的一个子集(毕竟我们不会想把整个数据库的数据全传到客户端来)。 第二,那些数据是被存储在浏览器内存中的,也就是说访问这些数据几乎不需要时间,不像去服务器访问 介绍 MiniMongoMeteor 的客户端 Mongo 的技术实现被成为 MiniMongo。它目前还不是一个完美的实现,而且你会发现偶尔 Mongo 的功能在这里不能实现。不过本书中涉及到的功能都是可以在 Mongo 和 MiniMongo 中实现的。 客户端-服务器通讯这一切最关键的是如何让客户端的集合数据与服务器端同名的集合数据同步(以我们现在这个例子来说是 与其现在就解释细节不如让我们先来看看发生了什么。 现在我们打开两个浏览器窗口,分别打开他们的浏览器控制台。然后在终端命令行打开 Mongo 外壳程序。 现在可以在这三个地方看到我们早前时候建立的那个文档。(注意,我们应用的用户界面依然显示着我们之前的三个演示 post,请忽略它们。)
让我们来创建一个帖子。在其中一个浏览器窗口中运行这个插入命令:
毫无疑问,这个帖子被加入到本地集合中。现在让我们查看一下 Mongo:
如同你所看见的那样,这个帖子一路上行一直到 Mongo 数据库中,而我们却没有为这个连接客户端和服务器的过程写任何一行代码。(严格地说,我们的确写了_一行_代码: 现在到第二个浏览器窗口的控制台中输入这个命令:
这个帖子居然也在这儿!甚至于我们连刷新都没有在第二个浏览器做过,更何况我们也没有写任何代码来推送更新。这一切想魔术一般 - 而且是即时的,尽管这一切以后看起来都很显而易见。 实际情况是服务器端的集合被客户端的集合通知说有一个新帖子,然后执行了一个任务把这个帖子放入 Mongo 数据库,进而会送到所有连接着的 在浏览器的控制台取出所有的帖子没什么用处。我们以后会学习如何把这些数据显示在模板中,并把这个简单的 HTML 原型变成一个有用的实时 Web 应用。 保持实时从浏览器控制台看到集合算是一件事儿,我们更应该关注的是能在屏幕上显示数据和数据的变化。要做到这一点,我们需要把我们的应用从一个单一显示静态数据的 让我们看怎么做。 从数据库提取数据首先我们先放点数据在数据库里。我们要做的是让服务器第一次初始启动的时候从一个数据文件中读取数据结构存在 首先我们要确保数据库中没有数据。我们使用 停止 Meteor 服务(通过键入
这个 reset 命令彻底地把 Mongo 数据库清空了。在开发的时候这个命令很有用,尤其当我们的数据库发生数据混乱的时候。 现在重启我们的 Meteor 应用:
现在数据库已经清空,我们可以增加下面的代码以便在服务器启动时候检查数据库
我们把这个文件放到了 现在我们用 动态数据现在如果我们打开一个浏览器的控制台,我们可以看到这三个帖子都被转载到 MiniMongo 中了:
要把这些 post 渲染到 HTML 中,我们需要用模板 helper。 在第三章中,我们看到 Meteor 允许我们把 数据上下文 捆绑到我们的 Spacebars 模板上,从而用 HTML 视图显示这些简单的数据结构。 我们可以同样把我们的集合数据捆绑起来。我们马上就替换掉静态的 现在请随手删掉
查找与提取在 Meteor 中, Meteor 十分智能地在应用中保持游标状态而避免动不动就把游标变成数组。这就造成了你不会经常在 Meteor 代码中看到 现在,与其把帖子们变成静态的数组,不如直接把游标赋给 我们可以清晰地看到 现在我们只需要再走一步;让我们通过控制台增加另一个帖子:
再看浏览器 - 你会看到这些: 你刚才第一次看到从动功能生效了。当我们告诉 handlebars 去枚举 检查 DOM 变动在目前的情况下,最简单的变动应该就是增加一个 现在在 Javascript 控制台,插入另外一个帖子。当你回到检查器,会发现一条新的 连接集合: 发布与订阅到此为止,我们仍然用着 打开一个终端窗口,输入:
这个操作有了立即的反应。当你打开浏览器,你会发现所有的帖子都不见了!这是因为我们一直依赖于 最终我们需要做得到我们仅仅把我们客户端需要看到的帖子传输过来(需要考虑分页的情况)。不过暂时我们可以先设置把 为达到这个目的,我们建立一个简单的
在客户端我们需要订阅这个发布。我们仅仅需要增加这样一行到
如果你现在看一眼浏览器,发现帖子都回来了。哇!好险啊! 总结我们都做了什么?尽管我们还没有用户界面,至少我们已经有了一个能用的应用。我们可以把这个应用部署到网络上,(使用浏览器的控制台)发帖子,并看到帖子显示在其他用户的浏览器上。 |
请发表评论