2014-10-06 18 views
5

Utilizzo di Meteor, mi piacerebbe capire il modo più efficiente per utilizzare il completamento automatico dell'interfaccia utente di JQuery con grandi volumi di dati sul lato server.Modo canonico per utilizzare il completamento automatico di JQueryUI con Meteor

Ho due proposte di lavoro e vorrei avere opinioni sulle differenze e se ci sono modi migliori per fare la stessa cosa.

Utilizzando pub/sub:

// Server 
Meteor.publish("autocompleteData", function (theSearchTerm) { 
    var query = { 
    name: { $regex: theSearchTerm, $options: 'i'} 
    }; 

    return MyData.find(query, options); 
}); 

// Client 
Template.myTemplate.rendered = function() { 
    initAutocomplete($(this.find('.my.autocomplete'))); 
}; 

var initAutocomplete = function(element){ 
    element.customAutocomplete({ 
    source: function(request, callback){ 
     var sub = Meteor.subscribe('autocompleteData', request.term, function(){ 
     var results = MyData.find({}, {limit: 50}).fetch(); 
     sub.stop(); 
     callback(results); 
     }); 
    }, 
    select: function(event, ui){ 
     // Do stuff with selected value 
    } 
    }); 
}; 

Uso delle funzioni remote (Meteor.Methods):

// Server 
Meteor.methods({ 
    getData: function(theSearchTerm) { 
    var query = { 
     name: { $regex: theSearchTerm, $options: 'i'} 
    }; 

    return MyData.find(query, {limit: 50}).fetch(); 
    }); 
}); 

// Client 
Template.myTemplate.rendered = function() { 
    initAutocomplete($(this.find('.my.autocomplete'))); 
}; 

var initAutocomplete = function(element){ 
    element.customAutocomplete({ 
    source: function(request, callback){ 
     Meteor.call('getData', request.term, function(err, results){ 
     callback(results); 
     }); 
    }, 
    select: function(event, ui){ 
     // Do stuff with selected value 
    } 
    }); 
}; 

Il che, se uno dei due, è il modo più efficiente per installare un completamento automatico sul lato server usando Meteor con un grande set di dati?

+0

Io non sono di gran lunga esperto di Meteor (vedi i miei numerosi post qui per chiedere aiuto), ma sembra sbagliato che tu stia facendo pub/sub e che abbia un metodo per ottenere Dati. Non sono sicuro del motivo per cui avresti bisogno di entrambi. – CodeChimp

+0

@CodeChimp Sì, lo so ... Ho anche funzionato usando puro pub/sub - aggiornerò la domanda per renderla più chiara. Immagino che cosa dovrei davvero chiedere è: sta iniziando e fermando un nuovo sottotitolo in ogni nuovo evento di ricerca il modo più performante per farlo? –

+0

Ancora, nessun esperto, ma penso che l'interruzione di un abbonamento significhi semplicemente che non ascolti più i cambiamenti dall'editore. Qualcuno con più esperienza di Meteor, per favore, parla se sono lontano da qui. Se sono corretto nella mia affermazione, penso che il successo della performance sarebbe continuo aggiornamenti nel tempo (per non annullare la sottoscrizione) VS. un possibile maggior successo quando si sottoscrive quando necessario. Penso che il futuro potrebbe essere attenuato restringendo il campo di applicazione della pubblicazione, che sembra si stia facendo. – CodeChimp

risposta

5

Per quello che vale, offrirò alcuni dei miei pensieri sull'argomento. Come disclaimer, sono solo un appassionato di Meteor e non un esperto, quindi per favore correggimi se ho detto qualcosa di sbagliato.

Per me, sembra un potenziale vantaggio di pub/sub in casi come questi è che i dati vengono memorizzati nella cache. Quindi, quando si sottoscrive lo stesso set di record, la ricerca sarà quasi istantanea poiché il client può cercare nella cache locale invece di chiedere nuovamente al server i dati (la pubblicazione è abbastanza intelligente da non inviare dati ripetuti al client).

Tuttavia, il vantaggio si perde qui poiché si interrompe l'abbonamento, quindi ogni volta che l'utente digita lo stesso termine di ricerca, i dati vengono nuovamente inviati al client (almeno, l'evento aggiunto del cursore si attiva nuovamente per ogni documento). In questo caso, mi aspetterei che il pub/sub sia su un piano quasi uguale con Meteor.call.

Se si desidera memorizzare nella cache i dati di pub/sub, un modo è quello di eliminare sub.stop(). Ma a meno che i tuoi utenti non abbiano la tendenza a cercare termini simili, la memorizzazione nella cache dei dati è in realtà peggiore poiché con ogni lettera l'utente digita più dati sul client, forse non sarà mai più visualizzato (a meno che la ricerca non sia una caratteristica così app che l'utente trarrebbe beneficio da questo?).

Nel complesso, non vedo alcun avvincente vantaggio nell'usare i metodi Meteor/Sub su Meteor, anche se non sono esperto in Meteor abbastanza bene da offrire vantaggi/svantaggi più specifici tra i due. Personalmente ritengo che i metodi Meteor sembrino più puliti.

Se si sta tentando di implementare una funzione di ricerca, personalmente mi piace il pacchetto easy-search, che supporta questo tipo di ricerca sul lato server con completamento automatico. In ogni caso, spero che la tua domanda venga risolta! Sono curioso di sapere anche la risposta.

+0

Grazie, roba utile. Per quanto riguarda l'interruzione del sottotitolo, tenere una cache sarebbe davvero molto utile, le stesse ricerche sono usate ancora e ancora, ma sai se posso chiamare ripetutamente Meteor.subscribe() con termini dinamici e trarne ancora beneficio? L'unica cosa che non voglio fare è iscriversi a TUTTI i dati senza un termine da filtrare. –

+0

@OliverLloyd Sì, ho avuto anche la stessa preoccupazione. Non si vuole assolutamente iscriversi quando non esiste un termine di ricerca, dal momento che * * * trasmetterà indiscriminatamente tutti i documenti. È piuttosto difficile stabilire quale impatto ciò comporterà (poiché dipende in gran parte dagli stessi contenuti dei documenti), ma potresti compilare il completamento automatico con i dati solo dopo che sono state inserite tante lettere, quindi la quantità di dati memorizzati nella cache è relativamente più piccolo ma molto più rilevante (hai detto che ricerche simili sono fatte, quindi le ricerche probabilmente condividono lettere iniziali simili). – mark

Problemi correlati