6

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

问题。它有效并且文档被接收,除非客户端更改关键字,或者更确切地说,当关键字更改时,出版物发布与关键字匹配的其他文档,但客户端集合从不删除旧文档。

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

我认为由于订阅的参数发生了变化,不匹配的文档将被取消订阅,并且只会订阅新的匹配文档。

4

2 回答 2

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' )
    });
});
于 2013-10-06T16:09:19.400 回答
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);
        }
    }
  });
于 2013-10-07T18:12:00.177 回答