我在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是正确的选择......),我就继续填充/更新预先输入源。
答案 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')});
}