2015-03-30 2 views
0

Мне нужно выполнить поиск в текстовом поле (mongodb). Критерии поиска/фильтр в коллекции могут быть любой подстрокой укуса в поле. Я сохраняю фильтр (ввод) в переменной сеанса. Кажется, что фильтр работает в первый раз после того, как SessionVariable имеет значение NULL. После первого поиска я не получаю результата при вводе нового значения (extisting!). В случае, если я очистил фильтр, нажмите enter и верните фильтр, чтобы получить результат. Я предполагаю, что мой код субоптимален. Может кто-то может рассмотреть и, возможно, сделать предложение?Поиск не очищает фильтр

Вот что у меня есть:

HTML:

<input class="medinput" maxlength="80" type="text" name="nameSearchBar" id="nameSearchBar" value="{{searchText}}"> 

JavaScript:

Session.setDefault('searchText', null); 

Template.questions.helpers({ 
    questions:function(){ 
     if ((Session.get('searchText') === null) || (Session.get('searchText') === '')) { 
     Session.get('searchText',null); 
     return Questions.find({archived:{$ne:true}}); 
    } else { 
     var searchText = Session.get('searchText'); 
     Session.get('searchText',null); 
     return Questions.find({ $and: [ { archived: { $ne: true } }, {note:{$regex: (".*"+searchText+".*") } } ] }) 
    } 
    }, 
    searchText:function(){ 
     return Session.get('searchText'); 
    } 
}) 


Template.questions.events({ 
"change #nameSearchBar":function(event){; 
     searchText = event.target.value; 
     Session.set('searchText', searchText); 
    } 
}) 

Вопросы:

  • почему мне нужно сначала "войти" пустая строка, чтобы получить действительный результат
  • это хорошая процедура? Не попадает ли на работу против реактивного подхода ? Я думаю, что после входа в полную страницу возникает недовольство?
  • Было бы лучше проверить «клавиатуру» для ASCII 27 и 13?
  • Мне кажется, что регулярное выражение работает, есть ли проблемы? Мне нравится находить любую подстроку типированного фильтра, также, когда фильтр имеет пробел.
  • Это полный текстовый поиск, нужно ли мне что-то задавать на стороне монгодба?
  • Открытый вопрос: являются уже prebuild implementiations - мне не нужно изобретать велосипед ...

ответ

1

Вот моя интерпретация, или, как я бы, возможно, построил этот:

Template.questions.helpers({ 
    questions:function(){ 
     var searchText = Session.get('search-text'); 
     if(searchText && searchText != '') { 
      return Questions.find({$and: [{archived: {$ne: true}}, {note:{$regex: (".*"+searchText+".*")}}]}); 
     } else { 
      return Questions.find({archived: {$ne: true}}); 
     } 
    } 
}); 

Template.questions.events({ 
    "keyup #nameSearchBar": _.throttle(function(event){ 
     searchText = event.target.value; 
     Session.set('searchText', searchText); 
    }), 500) 
}); 

К мне не нужно устанавливать значение по умолчанию или вызвать Session.get('search-text', null). Также вы увидите, как мой код немного более краток. keyup, вероятно, более эффективен как событие здесь.

N.B. _.throttle - это функция underscore.js, которая ограничивает изменение переменной Session только каждые 500 мс, а не постоянно. Это помогает сэкономить нагрузку на сервер.

Два встроенных пакеты, которые пользуются популярностью среди разработчиков Метеора стоит посмотреть в: Easy Search или Search Source

0

Я скопировал в целом рабочий пример для поиска на одном текстовом поле.

@Ian: Спасибо за предложение! Я взял часть переключения, я обнаружил, что вы не можете оставить переменную сеанса как есть, даже если она переписывается, она должна быть оценена раньше. Поэтому его нужно вернуть с помощью NULL.

Session.setDefault('searchText', null); 

Template.questions.helpers({ 
questions:function(){ 
    if ((Session.get('searchText') === null) || (Session.get('searchText') === '')) { 
      return Questions.find({archived:{$ne:true}}); 
     } else { 
      var searchText = Session.get('searchText'); 
      return Questions.find({ $and: [ { archived: { $ne: true } }, {note:{$regex: (".*"+searchText+".*") } } ] }) 
     } 
    }, 
    searchText:function(){ 
     return Session.get('searchText'); 
    } 
}) 
Template.questions.events({ 
    'keyup #nameSearchBar': _.throttle(function(event){; 
     Session.set('searchText',null); 
     searchText = event.target.value; 
     Session.set('searchText', searchText); 
    },500) 
}) 
Смежные вопросы