如何获得订阅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源代码。
答
我问过类似的问题在这里: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')});
}
我已经设法通过使用确实客户端观察得到这个工作。我会尽快发布一些代码来演示如何完成这项工作 – matb33 2012-08-06 05:52:32
睡眠并重新获得清晰的头后,它让我感到自动订阅完全符合我的需求。现在看起来如此明显...... – matb33 2012-08-08 13:24:12