фильтрация коллекции из магистрали с атрибутами - PullRequest
1 голос
/ 01 марта 2012

У меня есть базовая коллекция, и я пытаюсь фильтровать по идентификатору внутри атрибутов, у пользователя есть классы, а у класса есть location_id, и я хочу фильтровать по идентификатору местоположения.Моя коллекция выглядит так, чтобы дать вам представление.

-user
   -models
     -0
       -attributes
         -location_id
      -1
       -attributes
         -location_id
      -2
       -attributes
         -location_id

Я думал, что смогу отфильтровать это, используя

  var get_locations = user_class_collection.filter(function(classes){
      console.log(classes); 
       return classes.get(location_id)==location.id;
       });

  console.log(get_locations);

, но это возвращает пустой массив, когда я знаю location_idнаходится в коллекции.Есть идеи, почему это не работает?Я также пытался схватить classes.attributes.get, но это было не лучше

В первых нескольких ответах было правильно упомянуто, что я должен был цитировать get('location_id').Я уже сделал это, но, к сожалению, я все еще получаю пустой массив.Я думал, что filter будет проходить через классы, и я получу консольный вывод для каждого класса, но console.log(classes) запускается только один раз.Это намек?Или красная сельдь?

Ответы [ 3 ]

6 голосов
/ 01 марта 2012

вы пытаетесь получить свойство из классов, которое названо значением параметра location_id вместо этого вы должны сделать эту строку (на самом деле вы можете выбрать, как сделать ее строкой, одинарные или двойные кавычки обе работают)

user_class_collection.filter(function(classes){
    return classes.get('location_id') == location.id;
});
1 голос
/ 18 октября 2013

Для фильтрации коллекции с использованием магистрали лучше всего использовать фильтрованную функцию в вашей коллекции

var UserCollection = Backbone.Collection.extend ({
  filtered : function ( id ) { 

Я предлагаю использовать фильтр UnderScore, который будет возвращать true для действительного и false для недействительного, где true - это то, что выищем.используйте this.models, чтобы получить текущие модели коллекций; используйте model.get (''), чтобы получить элемент, который вы хотите проверить на

    var results = _.filter( this.models, function ( model ) { 
        if ( model.get('location_id') == id  ) 
        return true ; 
    return false ;
    });

. Затем используйте карту подчеркивания для своих результатов и преобразуйте ее в JSON, как * 1007.*

    results = _.map( results, function( model ) { return model.toJSON()  } );

Наконец, возвращаем новую базовую коллекцию только с результатами

    return new Backbone.Collection( results ) ;

По желанию, если вы не хотите сохранять все данные в коллекции, а только отфильтрованные, вам следует сбросить коллекциюи пропустите приведенный выше возврат, как

    this.reset( results ) ;

Просмотр вызов отфильтрованной коллекции и рендеринга результата

0 голосов
/ 01 марта 2012

Попробуйте это:

user_class_collection.select(function(classes){
    return classes.get("location_id")==location.id;
   });
...