javascript - Backbone.js 过滤集合中的任何值

标签 javascript backbone.js

我有一个搜索/过滤字段,我希望能够过滤集合中的任何值。我的数据如下:

 exports.administrators = [
{
  id: 1,
  firstName: "User1",
  lastName: "Tester",
  phone: "781-000-0000",
  email: "user1.tester@email.com",
  privileges: "view-only"
}, {
  id: 2,
  firstName: "Mickey",
  lastName: "Mouse",
  phone: "781-123-4567",
  email: "mickey.mouse@disney.com",
  privileges: "all"
}, {
  id: 3,
  firstName: "Snow",
  lastName: "White",
  phone: "781-890-1234",
  email: "snow.white@disney.com",
  privileges: "all"
}, {
  id: 4,
  firstName: "Anakin",
  lastName: "Skywalker",
  phone: "888-874-9084",
  email: "anakin.skywalker@deathstar.com",
  privileges: "view-only"
}, {
  id: 5,
  firstName: "Obi-one",
  lastName: "Kenobi",
  phone: "908-765-5432",
  email: "obi.kenobi@jedi.com",
  privileges: "all"
}, {
  id: 6,
  firstName: "Master",
  lastName: "Yoda",
  phone: "876-654-2134",
  email: "yoda@jedi.com",
  privileges: "view-only"
}, {
  id: 7,
  firstName: "Han",
  lastName: "Solo",
  phone: "781-456-3209",
  email: "han.solo@gmail.com",
  privileges: "all"
}, {
  id: 8,
  firstName: "Neo",
  lastName: "TheOne",
  phone: "781-000-0000",
  email: "neo@matrix.com",
  privileges: "all"
}];

View 将根据 keyup 事件触发一个事件:

AdministratorView.prototype.events = {
  'click .sub-content th.sort, .sub-content th.sort-up, .sub-content th.sort-down': 'sortTable',
  'click .light-btn': 'showAdd',
  'keyup #filter-find': 'filterAdministrators'
};

我还抽象了要执行过滤的函数:

  App.Utils.filterCollection = function(collection, filterValue) {
if (filterValue !== "") {
  return _.filter(collection.models, function(data) {
    var values;
    values = _.values(data.attributes);
    _.each(values, function(value) {
      if (!isNaN(value)) {
        value = value.toString();
      }
      return value.indexOf(filterValue) > 0;
    });
  });
}

};

我遇到的问题是:

  1. filterCollection 函数返回未定义
  2. 有没有更优雅的方式来做到这一点?

提前感谢所有帮助。

干杯,

基亚诺什

更新函数:

我已经用@dbaseman 的一些输入更新了这个函数

  App.Utils.filterCollection = function(collection, filterValue) {
var filteredCollection;
if (filterValue === "") {
  [];
}
return filteredCollection = collection.filter(function(data) {
  return _.some(_.values(data.toJSON()), function(value) {
    value = !isNaN(value) ? value.toString() : value;
    return value.indexOf(filterValue) >= 0;
  });
});

};

但是我仍然从函数中得到一个空的(或未定义的)值。我被踩死了!!

更新#2 找到了部分解决方案。这是 jsFiddle - http://jsfiddle.net/kianoshp/YWSSp/。它过滤正确,但是当我清空过滤字段时,我希望显示原始数据集。但是现在我得到一张空白表。致力于解决方案,但任何帮助/提示都会有所帮助。

更新#3 最终解决方案在 jsFiddle 中 --> http://jsfiddle.net/kianoshp/YWSSp/77/ 感谢@dbaseman

最佳答案

我采纳了 McGarnagle 提供的答案并添加了一些改进。以下代码允许您在具有由对象组成的属性的模型内部进行搜索。

Backbone.Collection.prototype.filterValues = function(filterValue) {
if (filterValue === ""){
    return this.models;
}

function collectionFilter(data) {
    if(data.toJSON){
        data = data.toJSON();
    }

    return _.some(_.values(data), function(value) {
        if(_.isObject(value)){
            return collectionFilter(value);
        }

        if (_.isNumber(value)){
            value = value.toString();
        }

        if (_.isString(value)){
            value = value.toLowerCase();

            return value.indexOf(filterValue) !== -1;
        }

        return false;
    });
}

return this.filter(collectionFilter);
};

关于javascript - Backbone.js 过滤集合中的任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727074/

相关文章:

JavaScript 关闭帮助

javascript - 为什么当使用 Node Express 和 Backbone 获取请求时,我会得到用户集合和额外的对象?

javascript - 使用文档片段渲染 Backbone View 会中断事件处理

backbone.js - 如何访问 Handlebar 模板中的主干模型属性

forms - Backbone.js 和表单输入模糊

javascript - Backbone Collection 和 Marionette CompositeView 中未定义的模型原型(prototype)

javascript - 如何在angularjs中使用rootScope

javascript - 如果 Typescript 中不为 null,则声明环境变量

带有 jquery.push 的 Javascript 全局数组在备用函数中返回空数组

javascript - document.querySelector 通过 textContent