Использование метода подчёркивания "найти" в сборке опор
Я пытаюсь использовать метод 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/