我有一个Meteor模板,用于呈现集合的文档。订阅在模板的自动运行中设置:
Template.userSearch.rendered = ->
Session.set "userSearchLimit", 5
@autorun ->
Meteor.subscribe "userSearch", "something to find", Session.get "userSearchLimit"
当用户按下"加载更多"按钮我增加userSearchLimit会话变量,这会导致自动运行重新运行。由于我要求更多数据,订阅会更改,因此旧订阅将被拆除并创建一个新订阅,但实际数据的第一部分将是相同的。
问题是整个列表正在重绘,导致可怕的闪烁。当我按照建议here将调试日志记录放入find()方法时,我看到文档首先被删除,然后再次添加回来。
我原本希望服务器避免重新发送客户端上已存在的数据。
我该如何解决这个问题?
为了进一步混淆这个问题,我还尝试使用ddp-analyzer来查看正在发送的数据。一旦我使用它,那么只发送新数据并消除闪烁。一旦我停止使用它,问题就会出现。
答案 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?