【问题标题】:Filtering records according to dropdownlist根据下拉列表过滤记录
【发布时间】:2015-09-03 19:35:27
【问题描述】:

我需要根据下拉列表中的选择过滤列表或记录。 我有三个下拉菜单需要相互协作以反应方式过滤记录。即一个下拉列表中的值选择应该过滤受其他下拉列表值影响的记录。

var filterAndLimitResults = function (cursor) {

    if (!cursor) {
        return [];
    }

    var raw = cursor.fetch();

    var currentChosenCategory = chosenCategory.get();
    var currentChosenCity = chosenCity.get();
    var currentJtype = chosenJtype.get();

    console.log(currentChosenCategory);
    console.log(currentChosenCity);
    // filter category
    var filtered = [];
    if (!currentChosenCategory || currentChosenCategory == "" && !currentChosenCity || currentChosenCity == "" && !currentJtype || currentJtype == "")
    {
        filtered = raw;
      //  console.log(filtered);
    }
    else {

        filtered = _.filter(raw, function (item) {
          if(currentChosenCategory){
            return item.ccategory === currentChosenCategory ;
          }
          if(currentChosenCity){
            return item.city === currentChosenCity ;
            console.log(item.city === currentChosenCity);
          }
        });
      }

var currentLimit =limit.get();
//enforce the limit
if (currentLimit ) {
    filtered = _.first(filtered, currentLimit );
}
return filtered;
};

上面的代码既过滤了下拉列表,又限制了记录的数量,以实现无限滚动。

为基于文本的搜索编辑

这是我的搜索框事件图

"keyup #search-title":function(e,t){
     if(e.which === 27){
       searchTitle.set("");
     }
     else {
       var text = $(e.target.val);
       searchTitle.set(text)
       console.log(searchTitle.set(text));
     }
   }

这就是我在filteredAndLimitResults做的事情

if(!(!currentSearchTitle || currentSearchTitle == "")) {
      filtered = _.filter(filtered, function (item) {
              return item.title === currentSearchTitle ;
              console.log(item.title === currentSearchTitle);
      });
    }

当我在搜索框中输入内容时。所有的记录都消失了,当在新闻esc 时,它又恢复了原样。在console.log 中,我可以看到每次我按下一个键都会返回集合。

【问题讨论】:

    标签: meteor meteor-helper


    【解决方案1】:

    您需要一个接一个地强制执行过滤器。试试这样:

    var filterAndLimitResults = function (cursor) {
    
        if (!cursor) {
            return [];
        }
    
        var raw = cursor.fetch();
    
        var currentChosenCategory = chosenCategory.get();
        var currentChosenCity = chosenCity.get();
        var currentJtype = chosenJtype.get();
    
        console.log(currentChosenCategory);
        console.log(currentChosenCity);
        // filter category
        var filtered = [];
        if (!currentChosenCategory || currentChosenCategory == "" || currentChosenCategory === "All categories")
        {
            filtered = raw;
            //  console.log(filtered);
        }
        else {
            filtered = _.filter(raw, function (item) {
                if(currentChosenCategory){
                    return item.ccategory === currentChosenCategory ;
                }
            });
        }
        // filter city
        if (!(!currentChosenCity || currentChosenCity == "" || currentChosenCity === "All cities"))
     {
            filtered = _.filter(filtered, function (item) {
                if(currentChosenCity){
                    return item.city === currentChosenCity ;
                    console.log(item.city === currentChosenCity);
                }
            });
        }
        // filter JType
        if (!(!currentJtype || currentJtype == "" || currentJtype === "All Jtypes"))
     {
            filtered = _.filter(filtered, function (item) {
                if(currentJtype){
                    //update the item.ccategory with the right field
                    return item.ccategory === currentJtype ;
                }
            });
        }
        var currentLimit =limit.get();
        //enforce the limit
        if (currentLimit ) {
            filtered = _.first(filtered, currentLimit );
        }
        return filtered;
    };
    

    【讨论】:

    • 这是错字吗? if !(!currentChosenCity || currentChosenCity == "") ! 正在抛出错误。所以我做到了if (!(!currentChosenCity || currentChosenCity == ""))。另一件事是我现在看不到记录。它们没有被显示
    • 你说得对,我忘了括号,所以应该是if (!(!currentChosenCity || currentChosenCity == ""))。尝试在每个过滤器后添加console.log(filtered);
    • 它现在可以工作了,谢谢。只是另一件事我需要在下拉列表中添加一个所有城市,所有类别。所以应该像纽约的所有 ciategories 或西雅图的营销等等。我该怎么做呢?
    • 如果您的过滤器值(即currentChosenCity 匹配All cities),您可以跳过过滤。我编辑了答案。您还需要将“所有类别”选项推入下拉项目。您只需将其添加到 HTML 中,在 {{#each category}} 之前即可。这样它就会一直显示出来。
    • 非常感谢它现在正在工作。感谢您为帮助我所做的努力。
    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多