以下是我的代码摘要
posts = new Meteor.Collection "post"
if Meteor.isClient
Template.canvas.visualize = ->
logs = posts.find().fetch()
[.... svg() rendering based on logs....]
if Meteor.isServer
我需要使用jsonArray“logs”来进行svg()渲染。但是,这种方法每次都会重新渲染svg。如果我用固定的jsonarray硬编码日志,例如[{“name”:“test”,“x”:1,“y”:1},{“name”:“test2”,“x”:2,“y”:2},{“name”: “test3”,“x”:1,“y”:1}],它只渲染svg一次。但是,如果我使用上面的.find()。fetch(),似乎日志长度会随着时间的推移而改变并使重新呈现问题发生。这个问题是由服务器和客户端之间的mongodbs同步引起的吗?任何的想法?谢谢。
答案 0 :(得分:1)
模板函数形成一个反应式上下文,因此对反应式数据源(例如数据库查询)的更改将导致它们再次执行。换句话说,是的,数据正在同步到客户端,客户端正在重新呈现。如果您不希望这种情况发生,您可以将查询设为非反应性:
var logs = posts.find({}, {reactive: false}).fetch();
您可以尝试的另一件事是在帖子标记为就绪时设置会话变量。这里我们假设autopublish
已关闭,服务器有一个名为allPosts
的发布函数。
if Meteor.isClient
Meteor.startup ->
Meteor.subscribe 'allPosts', ->
Session.set 'logs', posts.find().fetch()
Template.canvas.visualize = ->
logs = Session.get 'logs'
if Meteor.isServer
Meteor.publish 'allPosts', ->
posts.find ranking: $lte: 3