多个svg渲染中的Meteor mongo问题

时间:2014-02-21 22:45:45

标签: mongodb meteor

以下是我的代码摘要

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同步引起的吗?任何的想法?谢谢。

1 个答案:

答案 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