2014-10-06 5 views
5

Используя Meteor, я хотел бы узнать наиболее эффективный способ использования автозаполнения JQuery UI с большими объемами данных на стороне сервера.Канонический способ использования JQueryUI Autocomplete with Meteor

У меня есть два рабочих предложения и хотелось бы услышать мнения о различиях и если есть какие-то лучшие способы сделать то же самое.

Использование паб/суб:

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

Использование функции удаленного (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 
    } 
    }); 
}; 

Что, если либо, является наиболее эффективным способом для установки на стороне сервера автозаполнения используя Meteor с большим набором данных?

+0

Я, безусловно, не эксперт в Meteor (см. Мои многочисленные сообщения здесь, просящие о помощи), но кажется неправильным, что вы делаете pub/sub и имеете метод getData. Не знаете, зачем вам обоим. – CodeChimp

+0

@CodeChimp Да, я знаю ... У меня также есть работа с использованием чистого паба/суб - я обновлю вопрос, чтобы сделать его более понятным. Я предполагаю, что я действительно должен спрашивать: начинается и останавливает новый юзер на каждом новом событии поиска наиболее эффективный способ сделать это? –

+0

Опять же, нет эксперта, но я думаю, что остановка подписки просто означает, что вы больше не слушаете изменения издателя. Кто-то, у кого больше опыта в Meteor, пожалуйста, сообщите, если я ухожу отсюда. Если я прав в своем заявлении, я думаю, что сбой производительности будет постоянным обновлением с течением времени (для не-подписки) VS. возможный больший удар при подписке при необходимости. Я думаю, что позже можно было бы смягчить сужение сферы действия вашей публикации, что, кажется, вы делаете. – CodeChimp

ответ

5

Для чего это стоит, я предложу несколько своих мыслей по этому вопросу. Как отказ от ответственности, я просто энтузиаст Метеор, а не эксперт, поэтому, пожалуйста, поправьте меня, если я сказал что-то ошибочное.

Для меня это похоже на потенциальное преимущество pub/sub в таких случаях, что данные кэшируются. Поэтому при подписке на один и тот же набор записей поиск будет почти мгновенным, так как клиент может искать локальный кеш, вместо того чтобы снова запрашивать сервер для данных (публикация достаточно умна, чтобы не нажимать на клиента повторные данные).

Однако преимущество здесь теряется, так как вы прекращаете подписку, поэтому каждый раз, когда пользователь вводит один и тот же термин поиска, данные снова переносятся на клиента (по крайней мере, добавленное событие курсора снова запускается для каждого документа). В этом случае я ожидал, что pub/sub будет находиться на равных с Meteor.call.

Если вы хотите кэшировать данные pub/sub, один из способов - вывести sub.stop(). Но если у ваших пользователей не наблюдается поиск похожих терминов, кэширование данных на самом деле хуже, потому что с каждой буквой, которую пользователь вводит больше данных, будет храниться на клиенте, возможно, никогда больше не будет видно (если поиск не является такой важной функцией в вашем приложение, которое пользователь выиграет от этого?).

В целом, я не вижу особого преимущества с использованием паба/вспомогательного оборудования над методами Метеор, хотя я не разбираюсь в Метеор достаточно хорошо, чтобы предложить более конкретные преимущества/недостатки между ними. Я лично считаю, что методы Метеор выглядят более чистыми.

Если вы пытаетесь реализовать функцию поиска, мне лично нравится пакет easy-search, который поддерживает этот тип поиска на стороне сервера с автозаполнением. В любом случае, надеюсь, вы решаете свой вопрос! Мне тоже интересно узнать ответ.

+0

Спасибо, полезный материал. Что касается остановки субблока, то хранение кеша было бы очень полезно, одни и те же поисковые запросы повторяются снова и снова, но знаете ли вы, что я могу неоднократно называть Meteor.subscribe() динамическими терминами и все же пользоваться им? Единственное, что я не хочу делать, это подписаться на ВСЕ данные без срока фильтрации. –

+0

@OliverLloyd Да, у меня тоже была такая же забота. Вы абсолютно не хотите подписываться, когда нет поискового запроса, так как это * будет * без разбора отправлять все документы. Трудно сказать, насколько сильно это повлияет (поскольку это во многом зависит от самих документов), но вы могли бы заполнить автозаполнение данными только после того, как было введено столько букв, поэтому количество кэшированных данных относительно меньше, но гораздо более актуальным (вы сказали, что аналогичные поиски сделаны, поэтому поисковые запросы, вероятно, имеют похожие стартовые письма). – mark