3

如果我想为一个集合做一个自动完成,最好的方法是什么?我想看看搜索字符串是否在我的模型中的任何(或少数几个)属性中。

我在想类似...

this.collection.filter(function(model) {
    return model.values().contains($('input.search]').val());
})

编辑对不起,我解释得不够好。如果我有一个带有属性的集合......

[ 
  { first: 'John', last: 'Doe'}, 
  { first: 'Mary', last: 'Jane'} 
]

我想在a搜索中输入,捕获 keyup 事件,然后过滤掉{ first: 'Mary', last: 'Jane'},因为 John 和 Doe 都不包含a.

4

4 回答 4

9

你可以看看模型attributes做这样的事情......

var search = $('input.search]').val();
this.collection.filter(function(model) {
    return _.any(model.attributes, function(val, attr) {
        // do your comparison of the value here, whatever you need
        return ~val.indexOf(search);
    });;
});
于 2013-08-07T20:03:02.040 回答
2

您不需要过滤和比较值。Backbone 有一个内置方法where,可以从集合中获取模型的子集。

http://backbonejs.org/#Collection-where

var friends = new Backbone.Collection([
  {name: "Athos",      job: "Musketeer"},
  {name: "Porthos",    job: "Musketeer"},
  {name: "Aramis",     job: "Musketeer"},
  {name: "d'Artagnan", job: "Guard"},
]);

var musketeers = friends.where({job: "Musketeer"});
于 2013-08-07T20:07:04.357 回答
1

您希望您model的项目中的collection任何值v都包含您的搜索文本q。这转化为以下内容。

var q = $('input.search').val();
this.collection.filter(function(model) {
    return _.any(model.values(), function(v) {
        return ~v.indexOf(q);
    });
})
于 2013-08-07T21:35:08.177 回答
0

我选择了这个......不区分大小写的子字符串匹配我的模型属性的子集。

var search = $(e.currentTarget).val().toLowerCase();
this.collection.filter(function(model) {
  return _.some(
    [ model.get('first'), model.get('last') ], 
    function(value) {
      return value.toLowerCase().indexOf(search) != -1;
    });
 });
于 2013-08-07T21:35:18.290 回答