2014-10-06 16 views
5

Korzystając z Meteor, chciałbym poznać najbardziej efektywny sposób korzystania z autouzupełniania interfejsu użytkownika JQuery z dużymi wolumenami danych po stronie serwera.Kanoniczny sposób korzystania z autouzupełniania JQueryUI z Meteorem

Mam dwie propozycje robocze i chciałbym usłyszeć opinie na temat różnic i czy istnieją lepsze sposoby na zrobienie tego samego.

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

Korzystanie ze zdalnych funkcje (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 
    } 
    }); 
}; 

Które, jeśli obaj, jest to najbardziej efektywny sposób skonfigurować autouzupełniania server-side używając Meteera z dużym zestawem danych?

+0

Nie jestem zdecydowanie ekspertem od Meteor (zobacz moje wiele postów tutaj proszących o pomoc), ale wydaje się, że robisz pub/sub i masz metodę getData. Nie wiem, dlaczego potrzebujesz obu. – CodeChimp

+0

@CodeChimp Tak, wiem ... Mam również działający przy użyciu czystej pub/sub - zaktualizuję pytanie, aby było bardziej zrozumiałe. Domyślam się, że naprawdę powinienem pytać: czy uruchamianie i zatrzymywanie nowego sub w każdym nowym wyszukiwaniu jest najbardziej wydajnym sposobem na zrobienie tego? –

+0

Znów nie ma eksperta, ale myślę, że zatrzymanie subskrypcji oznacza po prostu, że nie słuchasz już zmian od wydawcy. Ktoś, kto ma więcej doświadczenia z Meteorytem, ​​powinien się odezwać, jeśli znajdę się poza bazą. Jeśli mam rację w swoim oświadczeniu, myślę, że hitem wydajności byłaby ciągła aktualizacja w czasie (aby nie anulować subskrypcji). możliwe większe trafienie podczas subskrybowania w razie potrzeby. Myślę, że później można złagodzić zawężając zakres publikacji, co wydaje się, że robisz. – CodeChimp

Odpowiedz

5

Za to, co warto, przedstawię kilka moich przemyśleń na ten temat. Zastanawiam się, jestem entuzjastą Meteorytów, a nie ekspertem, więc proszę, popraw mnie, jeśli powiem coś wadliwego.

Dla mnie wygląda to na potencjalną zaletę pub/sub w takich przypadkach, że dane są buforowane. Tak więc przy subskrybowaniu tego samego zestawu rekordów wyszukiwanie będzie niemal natychmiastowe, ponieważ klient może przeszukiwać lokalną pamięć podręczną zamiast ponownie pytać serwer o dane (publikacja jest wystarczająco inteligentna, aby nie przekazywać powtórnych danych do klienta).

Jednak traci się tutaj przewagę, ponieważ zatrzymujesz subskrypcję, więc za każdym razem, gdy użytkownik wpisze to samo wyszukiwane hasło, dane są ponownie przesyłane do klienta (przynajmniej zdarzenie dodawane przez kursor uruchamia się ponownie dla każdego dokumentu). W tym przypadku spodziewam się, że pub/sub będzie na prawie równej stopie z Meteor.call.

Jeśli chcesz buforować dane pub/sub, jednym ze sposobów jest wyjęcie sub.stop(). Ale chyba że twoi użytkownicy mają tendencję do wyszukiwania podobnych terminów, buforowanie danych jest w rzeczywistości gorsze, ponieważ z każdą literą, którą użytkownik wpisuje, więcej danych będzie przechowywanych na kliencie, być może nigdy więcej nie będzie widocznych (chyba że wyszukiwanie jest tak ważną cechą w twoim aplikacja, z której skorzystałby użytkownik?).

Ogólnie rzecz biorąc, nie widzę żadnej istotnej przewagi przy korzystaniu z pub/sub przez meteorów, ale nie jestem wystarczająco zorientowany w Meteorrze, aby oferować bardziej szczegółowe zalety/wady między tymi dwoma. Osobiście uważam, że metody Meteor są jednak czystsze.

Chociaż próbuję zaimplementować funkcję wyszukiwania, ja osobiście lubię pakiet easy-search, który obsługuje ten typ wyszukiwania po stronie serwera za pomocą autouzupełniania. W każdym razie, mam nadzieję, że rozwiążesz swoje pytanie! Ciekawy jestem też znać odpowiedź.

+0

Dzięki, użyteczne rzeczy. Co się tyczy zatrzymania sub-a, przechowywanie pamięci podręcznej byłoby bardzo przydatne, te same wyszukiwania są używane wielokrotnie, ale czy wiesz, czy mogę wielokrotnie wywoływać Meteor.subscribe() z warunkami dynamicznymi i nadal korzystać z niego? Jedyną rzeczą, której nie chcę robić, jest zasubskrybowanie WSZYSTKICH danych bez określenia filtra. –

+0

@OliverLloyd Yeah, ja też miałem ten sam niepokój. Absolutnie nie chcesz subskrybować, gdy nie ma szukanego terminu, ponieważ * będzie * bezkrytycznie przesyłać wszystkie dokumenty. Trudno powiedzieć, jaki będzie to wpływ (ponieważ zależy to w dużej mierze od zawartości samych dokumentów), ale możliwe, że uzupełni autouzupełnianie danymi dopiero po wprowadzeniu tak wielu liter, a więc ilości danych w pamięci podręcznej jest względnie mniejszy, ale o wiele bardziej trafny (powiedziałeś, że podobne wyszukiwania są dokonywane, więc wyszukiwania prawdopodobnie mają podobne początkowe litery). – mark