如何在Meteor中执行基于参数的发布并删除旧的订阅文档?

时间:2013-10-06 03:04:58

标签: meteor

我想在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;
  }
});

问题所在。 除了客户端更改关键字之外,或者当关键字更改时,发布会发布与关键字匹配的其他文档,但客户端集合永远不会删除旧文档。

如何获取不再与客户端集合匹配的旧文档?

我认为,因为订阅的参数已经改变,不匹配的文件将被取消订阅,只会订阅新的匹配文件。

2 个答案:

答案 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);
        }
    }
  });