修改订阅时模板轻弹

时间:2014-11-26 20:49:07

标签: meteor

我有一个Meteor模板,用于呈现集合的文档。订阅在模板的自动运行中设置:

Template.userSearch.rendered = ->

   Session.set "userSearchLimit", 5

   @autorun ->
      Meteor.subscribe "userSearch", "something to find", Session.get "userSearchLimit"

当用户按下"加载更多"按钮我增加userSearchLimit会话变量,这会导致自动运行重新运行。由于我要求更多数据,订阅会更改,因此旧订阅将被拆除并创建一个新订阅,但实际数据的第一部分将是相同的。

问题是整个列表正在重绘,导致可怕的闪烁。当我按照建议here将调试日志记录放入find()方法时,我看到文档首先被删除,然后再次添加回来。

我原本希望服务器避免重新发送客户端上已存在的数据。

我该如何解决这个问题?

为了进一步混淆这个问题,我还尝试使用ddp-analyzer来查看正在发送的数据。一旦我使用它,那么只发送新数据并消除闪烁。一旦我停止使用它,问题就会出现。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题,手动等待新订阅准备就绪,然后再删除前一个订阅:

currentMatchingSub = null
prevMatchingSub = null

subscribeToUserSearch = (limit) ->

   prevMatchingSub = currentMatchingSub
   currentMatchingSub = Meteor.subscribe "userSearch", "john baker", limit, ->

      # Only once the new subscription is ready should be take down the previous one. This ensure's
      # that there's no flicker...

      prevMatchingSub.stop() if prevMatchingSub?
      prevMatchingSub = null

Template.userSearch.rendered = ->

   limit = 5
   Session.set "userSearchLimit", limit
   subscribeToUserSearch limit

Template.userSearch.destroyed = ->

   prevMatchingSub.stop() if prevMatchingSub?
   currentMatchingSub.stop() if currentMatchingSub?