集合:
它是meteor的核心,服务器端和客户端的自动数据同步。
集合是一个特殊的数据结构,它会将 数据存到mongodb中,在浏览器会有一个链接还进行实时同步。
它可不是通过ajax请求,而是用的websocket长链接来做的。
我们创建的集合需要在客户端和服务器端执行。
可以在lib内创建一个collection文件夹,它会在两端运行。
创建一个posts.js文件:
posts=new Mongo.Collection('posts');
创建时不需要用var 来创建变量来存储,因为var会限制对象的作用域在文件内。
我们想要在整个应用中访问就不需要var。
不在client 和server中的文件代码都会在两端运行,所以集合当然会在两端运行。
但是在环境下所起的作用有很大不同。
在服务器端它会和mongodb数据库联络。读取数据变化。
在客户端它是一个安全拷贝的数据子集,它会实时的更新本地数据。
我们可以以运行meteor mongo来启用命令
来操作数据,这是服务器端。
如果数据库在部署上,可以用:
meteor mongo myApp进行mongo shell
db.posts.insert({});
浏览器我们可以在console里,通过posts来获取数据
posts.find().count()
MiniMongo:
客户端的mongo实现被称为MiniMongo,它目前并不是完整的,有些mongo功能是无法实现的。
客户端-服务器通过:
现在就可以实时数据了。
在服务端添加一条数据,会映射到所有链接的本地。
我们可以通过meteor reset来重置数据库,会删除所所集合数据。
在server里可以创建js,
通过posts来获取数据,并且修改。
if(post.find().count()===0){
posts.insert({})
}
本地的postlist.js里也可访问posts。并返回数据到模板。
查找与提取。
在meteor中find()返回的是一个游标。而不是直接的数据。它是一种从数据源。
如果想使用可以fetch()把它转换成数组 。
发布与订阅:
现在我们一直用着autopublish这个包,它在创建项目时默认存在的。
它用来为我演示实时数据的实现。
它只是简单的把整个集合分享给所有链接的客户端。
实际开发中我们肯定不会这样的,一下把几百万的数据都缓存....
所以我们需要自己来编写.
meteor remove autopublish
当删除了包时,页面上数据也显示不出来了。
这是因为我一直用此包来实现实时数据的。
我们需要在服务端编写发布,来返回指定条件下的集合.
在server下创建publications.js
//发布集合 //定义发布名称 回返一个集合find //这里的发布是在server上运行的。 //客户端js需要订阅这个发布来获取数据。
Meteor.publish('posts',function(){
return post.find({status:0});//返回状态为0的数据。
});
//返回指定作者的集合 //通过给函数指定参数,用find来查找指定条件的数据。 //订阅时传递参数来返回指定条件的数据 Meteor.publish('postsAuthor',function(author){ return posts.find({status:0,author:author},{fields:{status:false}}); });
客户端订阅:
在client下的js里创建main.js
Meteor.subscribe('posts');//订阅
//订阅有条件的发布 //传递参数查找条件的数据 //这样本地的posts返回的就是查找的数据Meteor.subscribe('postsAthor','star')
发布时函数可以有参数,来实现条件发布。
订阅时传递值。
------------------------------------------------
总结:
集合在两端都需要创建的,需放在Lib里
发布和订阅,分别创建在两端。
服务器发布返回一个find() 可以指定返回属性和条件
本地订阅放在main.js里在运行最后执行。
发布和订阅用来建立两端链接,实现实时数据通信。
这样模板js里就可使用posts.find()来绑定数据了。