Javascript MeteorJS:重新订阅/刷新收藏?
我目前正在从事meteor项目,我不太了解meteor解决问题的方法。Javascript MeteorJS:重新订阅/刷新收藏?,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我目前正在从事meteor项目,我不太了解meteor解决问题的方法。 我有一个最初在pageload上调用的订阅。我在没有任何参数的情况下订阅以下出版物: Meteor.publish('testCollection', function(searchitem){ if(searchitem){ return testCollection.find({name:searchitem}); } else{ return testCollec
我有一个最初在pageload上调用的订阅。我在没有任何参数的情况下订阅以下出版物:
Meteor.publish('testCollection', function(searchitem){
if(searchitem){
return testCollection.find({name:searchitem});
}
else{
return testCollection.find({},{
sort: { rating: -1 },
limit: 5,
fields: {
_id:1,
name:1,
description:1
}
});
}
});
这非常有效,我从else案例中得到了结果。但我希望用户能够在此集合中搜索名称。 因此,我的刷新想法是在提交searchbutton时使用:
Meteor.subscribe("testCollection","abc");
但这并不是在刷新我的客户端测试集合。
我怎样才能做到这一点?我是否必须取消订阅并再次订阅,如果是:如何订阅?这里的关键是通过始终限制结果来限制在客户端发送(以及可能存储)的数据 简言之,这一切都是关于重新订阅出版物。这可以通过多种方式实现,但最简单的(在我的竞争中也是最优雅的)是使用自动运行和反应源,如或。无论何时更改此源,都会触发新的订阅,并取消以前的订阅 来自Meteor文档: 例如,如果在反应计算中调用Meteor.subscribe 示例使用Tracker.autorun,订阅将自动 当计算无效或停止时取消;不是 需要对从内部自动运行进行的订阅调用停止 重新订阅的代码可能如下所示:
Tracker.autorun(function() {
if (Session.get('someCustomQuery'))
Meteor.subscribe('testCollection', Session.get('someCustomQuery'));
});
我将推荐David Burles的本教程:
事件触发的ReactiveVar示例代码:
Template.myTemplate.rendered = function(){
var self = this;
Tracker.autorun(function() {
if (self.searchQuery.get())
{
var queryOptions = {
query: self.searchQuery.get()
};
Meteor.subscribe('testCollection', queryOptions);
}
});
}
Template.myTemplate.created = function(){
this.searchQuery = new ReactiveVar('');
};
Template.myTemplate.events({
'keyup [type=search]': function(event, template) {
template.searchQuery.set(event.target.value);
}
});
清理数据库输入!用户可以将Mongo选择器作为
searchItem
,使用check(searchItem,Match.OneOf(String,undefined))
。您能解释一下吗?在我的代码中,我应该在哪里传递这个Mongo选择器,我应该在哪里调用check函数?check函数用于证明变量只是字符串或未定义,对吗?是的。这样,您就可以确信客户发送的内容正是您所期望的。@smoksnes谢谢您的回答,我试过了,它立刻就起作用了。所以我必须在会话中使用Tracker.autorun()?为什么我不能简单地调用Meteor.subscribe('testCollection',searchitem),在我想要的地方(可能在eventhandler或其他东西中)?@ant45de->您应该能够直接调用subscribe,即使我没有尝试过。Meteor的强大之处在于它是反应性的,因此无论在哪里使用反应性组件,您都可以通过倾听反应性组件来简化代码。我添加了一个使用ReactiveVar而不是Session的示例,如果您和我一样不喜欢使用Session,而它只在一个模板中使用。@ant45de您应该参考文档,这是关于reactivity的。smoksnes,对于您的追踪器,您可能需要检查。另外,您知道您可以简单地调用函数,而不是编写this
?想想看,您可能希望使用事件处理程序,这样它就不会被用户键入的每个字符触发。@ant45de开销是实现这一点的原因。您要做的是创建订阅以获取特定搜索的数据,然后如果该搜索发生更改,则更改数据。唯一的方法是取消以前的订阅并创建一个新的订阅,Tracker做得非常好。