2013-10-06 1 views
6

Я хочу реализовать публикацию в 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; 
    } 
}); 

Проблема. Работает и документы принимаются, за исключением случаев, когда клиент изменяет ключевое слово или, скорее, по мере изменения ключевых слов публикация публикует дополнительные документы, соответствующие ключевым словам, но коллекция клиентов никогда не удаляет старые документы.

Как получить старые документы, которые больше не совпадают с коллекцией клиентов?

Я думал, что, поскольку параметры подписки изменились, что несоответствующие документы будут отписаны, и будут подписаны только новые соответствующие документы.

ответ

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') 
    }); 
}); 
+0

Сторона клиента с ручкой, похоже, не поддерживает метод остановки. –

+1

Параметр var должен быть определен вне локальной области. Обновлено. – mquandalle

+2

Интересно, для повышения производительности вам не следует подписываться на новую подписку, прежде чем отказаться от подписки на старую подписку? Если в старой и новой подписке содержатся одни и те же документы, эти документы не будут отправляться по кабелю во второй раз, не так ли? –

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); 
     } 
    } 
    }); 
+0

'предложение' и' offerCurrent' не используется? –

+0

'array' должен быть' data'? –

+0

Изменения, происходящие на стороне сервера, не будут распространяться в реальном времени с помощью этого решения. –

Смежные вопросы