搜索不会清除过滤器

时间:2015-03-30 12:08:14

标签: javascript meteor

我需要在文本字段(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);
    }
})

问题:

  • 为什么我需要先“输入”一个空字符串才能获得有效的结果
  • 这是一个很好的程序吗?不击中输入对抗反应 进场?我想进入完整的页面后重新发送?
  • 检查ASCII 27和13的“keyup”会更好吗?
  • 在我看来,正则表达式有效,有什么顾虑吗?我喜欢在过滤器中找到任何类型的子字符串,当过滤器有空格时。
  • 这是一个全文搜索我需要在mongodb方面设置一些内容吗?
  • 开放性问题:已经是预制的实施 - 我不需要重新发明轮子......

2 个答案:

答案 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 SearchSearch 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)
})