Использование метода подчёркивания "найти" в сборке опор

Я пытаюсь использовать метод Underscore 'find' в коллекции, но он не дает мне ожидаемых результатов:

У меня есть базовая модель без настроек по умолчанию и коллекция по умолчанию. Модели моей коллекции имеют только два атрибута: tranId (директива как строка) и выполняют (функцию для выполнения).

Я пытаюсь найти элемент в коллекции, который соответствует tranId, который я передаю ему...

    var tranId = "1a2b3c";

    var found = _.find(myCollection, function(item){
        return item.tranId === tranId;
    });

Найдено всегда undefined, хотя отладчик показывает, что у моей коллекции действительно есть элемент, в котором tranId соответствует моей переменной. Я не могу установить точку останова в операторе return, чтобы узнать, что соответствует item.tranId. Я тоже пробовал это...

    var found = _.find(myCollection, function(item){
        return item.get('tranId') === tranId;
    });

Но то же самое. "found" всегда undefined. Что я здесь делаю неправильно?

Ответ 1

Базовая коллекция реализует многие из функций Underscore, поэтому вы можете сделать это:

var found = myCollection.find(function(item){
        return Number(item.get('tranId')) === tranId;
});

Также для отладки, если значения не являются ожидаемыми, попробуйте:

var found = myCollection.find(function(item){
        console.log('Checking values', item, item.get('tranId'), tranId);   
        return Number(item.get('tranId')) === tranId;
});

Ответ 2

Более простой:

var found = myCollection.findWhere({'tranId': tranId})

Подробнее см. here.

Если вы должны использовать метод Underscore:

var found = _.find(myCollection.models, function(item){
    return item.get('tranId') === tranId;
});

Поскольку myCollection.models - это массив, myCollection не.

Я предпочитаю первый.

Ответ 3

Коллекция не означает точно то же самое в Backbone (объект, управляющий списком моделей) и Underscore (список объектов). То, что вы должны передать на _.find, - это myCollection.models

_.find(myCollection.models, function(model) {
    return model.get('tranId')===tranId;
});

Как объяснил @Daniel Aranda, Backbone proxies Подчеркнуть методы в коллекциях, и вы могли бы написать свой пример как

myCollection.find(function(model) {
    return model.get('tranId')===tranId;
});

Наконец, если tranId - ваш идентификатор модели, вы можете установить id как idAttribute и упростить все это, используя get

var M=Backbone.Model.extend({
   idAttribute: "tranId"
});
var C=Backbone.Collection.extend({
    model:M
});

var myCollection=new C([
    {tranId:'not this one'} ,
    {tranId:'another'} ,
    {tranId:'1a2b3c'}
]);

myCollection.get(tranId);

И скрипт http://jsfiddle.net/rYPLU/