Подтвердить что ты не робот

Как найти модель из коллекции в соответствии с каким-либо атрибутом, отличным от ID?

У меня есть модель с несколькими объектами:

//Model
Friend = Backbone.Model.extend({
    //Create a model to hold friend attribute
    name: null,
}); 

//objects
var f1 = new Friend({ name: "Lee" });
var f2 = new Friend({ name: "David"});
var f3 = new Friend({ name: "Lynn"});

а также, я добавлю эти друзья в коллекцию:

//Collection
Friends = Backbone.Collection.extend({
    model: Friend,
});

Friends.add(f1);
Friends.add(f2);
Friends.add(f3);

и теперь я хочу получить модель в соответствии с именем Друга. Я знаю, что для этого могу добавить атрибут ID. Но я думаю, что должен быть еще более простой способ сделать это.

4b9b3361

Ответ 1

Коллекции backbone поддерживают метод underscorejs find, поэтому использование этого должно работать.

things.find(function(model) { return model.get('name') === 'Lee'; });

Ответ 2

Для простых поисков с использованием атрибутов вы можете использовать Collection#where:

где collection.where(attributes)

Возвращает массив всех моделей в коллекции, которые соответствуют переданным атрибутам . Полезно для простых случаев filter.

Итак, если friends - ваш экземпляр friends, то:

var lees = friends.where({ name: 'Lee' });

Там также Collection#findWhere (более позднее дополнение, как указано в комментариях):

findWhere collection.findWhere(attributes)

Точно так же, как и где, но прямо возвращает только первую модель в коллекции, которая соответствует переданным атрибутам.

поэтому, если вы только после этого, вы можете сказать такие вещи, как:

var lee = friends.findWhere({ name: 'Lee' });

Ответ 3

Самый простой способ - использовать опцию idAttribute для модели Backbone, чтобы позволить Backbone знать, что вы хотите использовать "имя" в качестве идентификатора модели.

 Friend = Backbone.Model.extend({
      //Create a model to hold friend attribute
      name: null,
      idAttribute: 'name'
 });

Теперь вы можете напрямую использовать метод Collection.get() для извлечения друга, используя свое имя. Таким образом, Backbone не перебирает все ваши модели Friend в коллекции, но может напрямую извлекать модель на основе ее "имени".

var lee = friends.get('Lee');

Ответ 4

Вы можете вызвать findWhere() в коллекциях Backbone, которые вернут именно ту модель, которую вы ищете.

Пример:

var lee = friends.findWhere({ name: 'Lee' });