admin管理员组

文章数量:1278948

If I were to want to do an autoplete for a collection, what would be the best way? I'd like to see if a search string is in any (or a select few) attributes in my model.

I was thinking something like...

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

Edit I'm sorry, I must not have explained it well enough. If I have a collection with attributes...

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

I want to type in a into my search, catch the keyup event, and filter out { first: 'Mary', last: 'Jane'}, as neither John nor Doe contains an a.

If I were to want to do an autoplete for a collection, what would be the best way? I'd like to see if a search string is in any (or a select few) attributes in my model.

I was thinking something like...

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

Edit I'm sorry, I must not have explained it well enough. If I have a collection with attributes...

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

I want to type in a into my search, catch the keyup event, and filter out { first: 'Mary', last: 'Jane'}, as neither John nor Doe contains an a.

Share Improve this question edited Aug 7, 2013 at 21:57 savinger asked Aug 7, 2013 at 19:54 savingersavinger 6,7149 gold badges42 silver badges58 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 9

You can look at the model's attributes to do something like this...

var search = $('input.search]').val();
this.collection.filter(function(model) {
    return _.any(model.attributes, function(val, attr) {
        // do your parison of the value here, whatever you need
        return ~val.indexOf(search);
    });;
});

You do not need to filter and pare values. Backbone has an inbuilt method where which fetches a subset of models from the collection.

http://backbonejs/#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"});

You want model items in your collection such that any of the values v contain your search text q. That translates to the following.

var q = $('input.search').val();
this.collection.filter(function(model) {
    return _.any(model.values(), function(v) {
        return ~v.indexOf(q);
    });
})

I went with this... case insensitive, substring matching for a subset of my model attributes.

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;
    });
 });

本文标签: javascriptFilter Collection by Substring in BackbonejsStack Overflow