如何获得订阅onReady(以前onComplete)最新的收集

问题描述:

我遇到了 onReady回调的问题。当它被调用时,正如文档所述:订阅已被标记为完成。但是,它正在修改的集合可能不会完成处理上次订阅之间的差异。如何获得订阅onReady(以前onComplete)最新的收集

一个快速演示可以通过修改托多斯例子可以看出:

$ meteor create --example todos

编辑client/todos.js,见线34替换为autosubscribe块:

Meteor.autosubscribe(function() { 
    var list_id = Session.get('list_id'); 
    var onReady = function (done) { 
    var list, todos = Todos.find(); 
    if (todos) { 
     list = todos.map(function (todo) { 
     return todo.text; 
     }); 
     if (done) { 
     console.log("subscription onReady called again 100ms later:", list); 
     } else { 
     console.log("subscription onReady called:", list); 
     setTimeout(function() { 
      onReady(true); 
     }, 100); 
     } 
    } 
    }; 
    if (list_id) 
    Meteor.subscribe('todos', list_id, onReady); 
}); 

启动的例子中,和在观看控制台时,从一个Todo List单击到另一个(参见左上角)。您会注意到,调用onReady时,集合包含以前待办事项列表中与新选择的待办事项列表串联的文档。

这是不是一个真正的错误,因为onReady从未暗示,当收集上调,最新的,但只有当订阅已经完成了它就会被解雇。

任何建议来解决这个问题?一旦收藏在订阅后被更新到最新,是否有办法立即得到通知?我想知道我是否应该依靠.observe ...但客户端上?这是可用的客户端?我明天可以试试这个...但我很乐意听到解决方案

仅供参考:我的用例围绕着typeahead Bootstrap JS plugin。我使用搜索查询向服务器发起订阅。服务器发布搜索结果,一旦客户端收到这些数据(希望onReady将是正确的选择......),我将继续填充/更新typeahead源代码。

+0

我已经设法通过使用确实客户端观察得到这个工作。我会尽快发布一些代码来演示如何完成这项工作 – matb33 2012-08-06 05:52:32

+0

睡眠并重新获得清晰的头后,它让我感到自动订阅完全符合我的需求。现在看起来如此明显...... – matb33 2012-08-08 13:24:12

我问过类似的问题在这里:Is there any way to know when an meteor subscription is 'valid'?

总之,你是什么回事正确的;答案很适当地过滤Todos集合,当你使用它:

Template.foo.todos = function() { 
    return Todos.find({list_id: Session.get('list_id')}); 
}