2013-10-06 9 views
6

Voglio implementare una pubblicazione basata su parametri in Meteor, ma sto riscontrando alcuni problemi.Come posso fare una pubblicazione basata su parametri in Meteor e rimuovere il vecchio documento di abbonamento?

Ecco quello che ho.

Mentre l'utente digita caso keyup della sottoscrizione alla pubblicazione e passa il valore dell'ingresso.

'keyup #customerSearch': function(event, template){ 
    var keyword = template.find('#customerSearch').value; 
    if(keyword){ 
     if(keyword.length >= 3){ 
     Meteor.subscribe('sessioncustomers', keyword); 
     } 
    } 
    } 

La pubblicazione utilizza questa parola chiave per restituire i record.

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

Il problema. Funziona e i documenti vengono ricevuti tranne quando il client cambia la parola chiave o piuttosto quando le parole chiave cambiano la pubblicazione pubblica documenti aggiuntivi che corrispondono alle parole chiave ma la raccolta client non rimuove mai i vecchi documenti.

Come faccio ad avere il vecchi documenti che corrispondono più fuori della collezione cliente?

ho pensato che, poiché i parametri della sottoscrizione avevano cambiato che i documenti non corrispondenti sarebbero sottoscritte e solo i nuovi documenti corrispondenti sarebbero sottoscritte.

risposta

9

Nella tua chiamata keyup devi "annullare l'iscrizione" alla pubblicazione precedente, altrimenti manterrai i vecchi documenti.

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; 
} 

Inoltre, non dimenticare di check(keyword, String) nella funzione pubblica, per la sicurezza.

Meteor.publish("sessioncustomers", function(keyword){ 
    check(keyword, String) 

    if (keyword.length >= 3) 
    return Customers.find({ 
     name: new RegExp(regExpQuoted(keyword), 'i') 
    }); 
}); 
+0

Il lato client di handle non sembra supportare un metodo di arresto. –

+1

La var dovrebbe essere definita al di fuori dell'ambito locale. Aggiornato. – mquandalle

+2

Mi chiedo, per aumentare le prestazioni, non dovresti abbonarti al nuovo abbonamento prima di annullare l'iscrizione al vecchio abbonamento? Se il vecchio e il nuovo abbonamento contengono degli stessi documenti, questi documenti non saranno inviati sul filo una seconda volta, giusto? –

1

fare una raccolta cliente senza nome locale

this.SessionCustomers = new Meteor.Collection(null); 

chiamare un metodo server per ottenere i risultati desiderati. Rendi il callback libero (rimuovi tutti) e quindi inserisci nella raccolta locale.

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

'offerta' e' offertaCurrent' non usati? –

+0

'matrice' dovrebbe essere' data'? –

+0

Le modifiche che si verificano sul lato server non verranno propagate in tempo reale con questa soluzione. –

Problemi correlati