如何获取订阅onReady(以前的onComplete)的最新集合

时间:2012-08-06 04:36:47

标签: meteor publish-subscribe

我在Meteor.subscribe上遇到onReady回调问题。调用它时,正如文档所述:订阅已标记为完成。但是,它正在修改的集合可能无法处理上次订阅之间的差异。

通过修改Todos示例可以看到快速演示:

$ meteor create --example todos

编辑client/todos.js,请参阅第34行。将自动订阅块替换为:

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列表中单击另一个(见左上角)。您会注意到,当调用onReady时,该集合包含先前Todo列表中与新选择的Todo列表连接的文档。

这不是一个真正的错误,因为onReady从未暗示当集合是最新的时会被触发,但仅限于订阅已完成。

有任何建议可以解决这个问题吗?在订阅后收集最新版本后,有没有办法立即通知?我想知道我是否应该依赖.observe ...而是在客户端?这是可用的客户端吗?我明天可能会尝试这个......但我很乐意听到解决方案

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

1 个答案:

答案 0 :(得分:0)

我在这里问了一个类似的问题: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')});
}