2014-10-06 7 views
5

Mit Meteor möchte ich die effizienteste Methode zur Verwendung der automatischen Vervollständigung von JQuery UI mit großen Datenmengen auf der Serverseite verstehen.Kanonische Methode zur Verwendung von JQueryUI Autocomplete mit Meteor

Ich habe zwei Arbeitsvorschläge und würde gerne Meinungen zu den Unterschieden hören und ob es bessere Möglichkeiten gäbe, das Gleiche zu tun.

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

Entfernte Funktionen (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 
    } 
    }); 
}; 

Which, wenn entweder ist das der effizienteste Weg zur Einrichtung einer serverseitigen zur automatischen Vervollständigung Meteor mit einem großen Datensatz verwenden?

+0

Ich bin bei weitem kein Experte auf Meteor (siehe meine vielen Beiträge hier um Hilfe bitten), aber es scheint falsch, dass Sie pub/sub tun und eine Methode haben, um Data zu bekommen. Nicht sicher, warum Sie beide brauchen würden. – CodeChimp

+0

@CodeChimp Ja, ich weiß ... Ich habe es auch funktioniert mit reinen Pub/Sub - Ich werde die Frage aktualisieren, um es klarer zu machen. Ich denke, was ich wirklich fragen sollte ist: Startet und stoppt ein neues Sub bei jedem neuen Suchvorgang den performantesten Weg, dies zu tun? –

+0

Nochmal kein Experte, aber ich denke, dass das Stoppen eines Abonnements einfach bedeutet, dass Sie nicht mehr auf Änderungen des Herausgebers warten. Jemand mit mehr Meteor Erfahrung sprechen Sie bitte, wenn ich hier weit weg bin. Wenn ich in meiner Aussage richtig bin, denke ich, dass der Performance-Hit im Laufe der Zeit kontinuierliche Updates (für das Nicht-Abbestellen) von VS sein würde. ein möglicher größerer Treffer beim Abonnieren bei Bedarf. Ich denke, dass das Spätere gemildert werden könnte, indem man den Umfang Ihrer Publikation einschränkt, was Sie anscheinend tun. – CodeChimp

Antwort

5

Für was es wert ist, werde ich ein paar meiner Gedanken zu dem Thema anbieten. Als Disclaimer bin ich nur ein Meteor-Enthusiast und kein Experte, also korrigiere mich bitte, wenn ich etwas Falsches gesagt habe.

Für mich scheint es ein potenzieller Vorteil von Pub/Sub in Fällen wie diesen ist, dass Daten zwischengespeichert werden. Wenn also derselbe Datensatz abonniert wird, erfolgt die Suche nahezu augenblicklich, da der Client den lokalen Cache durchsuchen kann, anstatt den Server erneut nach Daten zu fragen (die Veröffentlichung ist intelligent genug, um wiederholte Daten nicht an den Client zu senden).

Der Vorteil ist jedoch hier verloren, da Sie das Abonnement beenden. Jedes Mal, wenn der Benutzer den gleichen Suchbegriff eingibt, werden die Daten erneut an den Client gesendet (zumindest wird das Ereignis des Cursors für jedes Dokument erneut ausgelöst)). In diesem Fall würde ich erwarten, dass das Pub/Sub mit Meteor.call fast gleichberechtigt ist.

Wenn Sie die Daten von Pub/Sub zwischenspeichern möchten, ist eine Möglichkeit, die sub.stop() zu entfernen. Aber wenn Ihre Benutzer nicht die Tendenz haben, nach ähnlichen Begriffen zu suchen, ist die Zwischenspeicherung der Daten tatsächlich schlechter, da mit jedem Buchstaben des Benutzers mehr Daten auf dem Client gespeichert werden, vielleicht nie wieder gesehen werden (es sei denn, die Suche ist so ein herausragendes Merkmal in Ihrem App, dass der Benutzer davon profitieren würde?).

Insgesamt sehe ich keinen zwingenden Vorteil bei der Verwendung von Pub/Sub-Meteor-Methoden, obwohl ich Meteor nicht gut genug kenne, um spezifischere Vorteile/Nachteile zwischen den beiden anzubieten. Ich persönlich finde Meteor-Methoden sauberer.

Wenn Sie jedoch versuchen, eine Suchfunktion zu implementieren, mag ich persönlich das easy-search Paket, das diese Art der serverseitigen Suche mit Autocomplete unterstützt. Auf jeden Fall hoffe ich, dass Sie Ihre Frage gelöst bekommen! Ich bin neugierig, die Antwort auch zu wissen.

+0

Danke, nützliche Sachen. In Bezug auf das Stoppen des Subs wäre das Halten eines Caches in der Tat sehr nützlich, die gleichen Suchen werden immer wieder verwendet, aber wissen Sie, ob ich Meteorsubscribe() wiederholt mit dynamischen Termen aufrufen kann und trotzdem davon profitieren kann? Die eine Sache, die ich nicht tun möchte, ist, ALLE Daten zu abonnieren, ohne einen Begriff zu filtern. –

+0

@OliverLloyd Ja, ich hatte auch die gleiche Sorge. Sie möchten absolut nicht abonnieren, wenn es keinen Suchbegriff gibt, da dieser * wahllos alle Dokumente versendet. Es ist schwer zu sagen, welchen Einfluss dies haben wird (da es weitgehend vom Inhalt der Dokumente selbst abhängt), aber Sie könnten die Autovervollständigung möglicherweise erst mit Daten füllen, nachdem so viele Buchstaben eingegeben wurden, so dass die Datenmenge zwischengespeichert wird ist relativ kleiner, aber viel relevanter (Sie sagten, ähnliche Suchen werden gemacht, so dass Suchanfragen wahrscheinlich ähnliche Anfangsbuchstaben haben). – mark

Verwandte Themen