我目前正在研究我的流星项目,我不太明白Meteor的问题是什么。
我有一个最初在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-case得到了我的结果 但我希望用户能够在此集合中搜索名称。 所以我的提醒想法是在提交搜索按钮时使用:
Meteor.subscribe("testCollection","abc");
但这并没有让我的客户端testCollection更新。 我怎样才能做到这一点?我是否必须取消订阅并再次订阅,如果是的话:怎么做?
答案 0 :(得分:5)
这里的关键是通过始终限制结果来限制客户端发送(和可能存储)的数据。
简而言之,它只是重新订阅该出版物。这可以通过多种方式完成,但最简单的(在我的观点中最优雅)是使用带有反应源的自动运行,例如Session或ReactiveVar。每当更改此源时,都会触发新的订阅,并取消之前的订阅。
来自Meteor docs: http://docs.meteor.com/#/full/meteor_subscribe
如果你在反应计算中调用Meteor.subscribe,为 使用Tracker.autorun的示例,订阅将自动进行 计算失效或停止时取消;不是 必须在内部自动运行中调用停止。
您重新订阅的代码可能如下所示:
Tracker.autorun(function() {
if (Session.get('someCustomQuery'))
Meteor.subscribe('testCollection', Session.get('someCustomQuery'));
});
我将推荐David Burles的教程:
http://meteorcapture.com/simple-search-pattern/
带有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);
}
});