玩了几天 Meteor 总结一下遇到过的坑
如果是做教程里的 Todo 应用的确是很容易 但是如果要做复杂一点的应用坑就开始多起来 而且很多都是陨石坑级别的
- 文档间关联支持非常差 因为 mongoDB 没有原生的 join 操作 只能靠自己手动二次查询来关联对象,但是 - Meteor.publish 只支持返回数据库指针 不能返回已经查好的数据集(为了使用 mongoDB 的 tailable cursor 实现从数据库到应用层的数据推送)所以如果想要在服务器端直接关联只能自己用底层的 observe 和 observeChanges 的 API 来重写 publish 方法 非常复杂而且相关的文档也不全面 - 如果使用客户端 Join 的办法也会有问题 比如某个 document 中有个字段是数组 数组中有了新的元素进来 遇到这种情况 客户端直接 join 的对象就会收不到消息 因为 没有主动去 subscribe
解决办法: https://github.com/englue/meteor-publish-composite 使用这个包可以解决服务器端的 join 逻辑复杂的问题
关于这方面一些相关的文章: https://www.discovermeteor.com/blog/reactive-joins-in-meteor/
- 被关联的文档更新时不会触发 blaze 模版引擎的重绘 因为 join 上去的文档一般是直接用赋值的方式附加到主文档上的 blaze 读取该值的时候没有触发注册重绘的注册机制 所以当这个文档更新时也就不会触发重绘
解决办法
1.用 Template.<my object>.helpers 返回一个关联文档的指针 读取指针的值时会触发 Meteor 的重绘注册机制 所以当被关联的对象对象更新时就触发了重绘 例如
Template.book.helpers ({
'author' : function (){
return Authors.find (this.authorId );
}
});