我想在Meteor中实现基于参数的发布,但我遇到了一些问题。
这就是我所拥有的。
当用户键入订阅发布的keyup事件并传递输入值时。
'keyup #customerSearch': function(event, template){
var keyword = template.find('#customerSearch').value;
if(keyword){
if(keyword.length >= 3){
Meteor.subscribe('sessioncustomers', keyword);
}
}
}
该出版物使用此关键字返回记录。
Meteor.publish("sessioncustomers", function(keyword){
if(keyword ){
if(keyword.length >= 3){
query.name = new RegExp(regExpQuoted(keyword), 'i' );
Customers.find(query);
} else {
return null;
}
}else{
return null;
}
});
问题所在。 除了客户端更改关键字之外,或者当关键字更改时,发布会发布与关键字匹配的其他文档,但客户端集合永远不会删除旧文档。
如何获取不再与客户端集合匹配的旧文档?
我认为,因为订阅的参数已经改变,不匹配的文件将被取消订阅,只会订阅新的匹配文件。
答案 0 :(得分:9)
在您的keyup
回调中,您需要“取消订阅”之前的出版物,
否则你会保留旧文件。
var sessionCustomersHandler = false;
'keyup #customerSearch': function(event, template) {
var keyword = template.find('#customerSearch').value;
if (keyword && keyword.length >= 3)
var newSessionCustomersHandler = Meteor.subscribe('sessioncustomers', keyword);
if (sessionCustomersHandler)
sessionCustomersHandler.stop();
sessionCustomersHandler = newSessionCustomersHandler;
}
此外,为了安全起见,请不要忘记发布功能中的check(keyword, String)
。
Meteor.publish("sessioncustomers", function(keyword){
check(keyword, String)
if (keyword.length >= 3)
return Customers.find({
name: new RegExp(regExpQuoted(keyword), 'i' )
});
});
答案 1 :(得分:1)
制作本地未命名的客户端集合
this.SessionCustomers = new Meteor.Collection(null);
调用服务器方法以获得所需的结果。使回调清除(全部删除),然后插入到本地集合。
return Meteor.call('sessioncustomers', query, function(err, data) {
if (err) {
return console.log(err.message);
} else {
SessionCustomers.remove({});
var item, _i, _len;
for (_i = 0, _len = data.length; _i < _len; _i++) {
item = array[_i];
SessionCustomers.insert(item);
}
}
});