我需要在文本字段(mongodb)上进行搜索。集合上的搜索条件/过滤器可以是字段中sting的任何子字符串。我将过滤器(输入)保存在会话变量中。在Sessionvariable为null之后,过滤器似乎第一次工作。 在第一次搜索后,当我输入一个新的(extisting!)值时,我得不到任何结果。如果我清除过滤器,点击回车然后重新进入过滤器,我得到结果。 我认为我的代码不是最理想的。有人可以复习并提出建议吗?
这就是我所拥有的:
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);
}
})
问题:
答案 0 :(得分: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函数,它将会话变量限制为每500毫秒而不是不断变化。这有助于节省不必要的服务器负载。
Meteor开发人员中流行的两个预构建的软件包值得研究:Easy Search或Search Source
答案 1 :(得分: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)
})