1

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

通过修改 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);
});

启动示例,然后在观察控制台的同时从一个待办事项列表单击到另一个(见左上角)。您会注意到,当onReady被调用时,该集合包含来自前一个 Todo List 的文档与新选择的 Todo List 连接。

这并不是一个真正的错误,因为onReady从来没有暗示它会在集合是最新的时被触发,但只有在订阅完成时才会触发。

有什么建议可以解决这个问题吗?订阅后收藏更新后,有没有办法立即通知?我想知道我是否应该依赖.observe......但依赖客户端?那是可用的客户端吗?我明天可以试试这个……但我很想听听解决方案

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

4

1 回答 1

0

我在这里问了一个类似的问题:有什么方法可以知道流星订阅何时“有效”?

简而言之,您对正在发生的事情是正确的;答案只是在Todos使用时适当地过滤集合:

Template.foo.todos = function() { 
  return Todos.find({list_id: Session.get('list_id')});
}
于 2012-08-06T23:19:34.617 回答