我正在尝试在集合中使用Underscore方法'find',但它没有给我我预期的结果:
我有一个没有默认值的基本模型和一个默认集合。我的集合中的模型只有两个属性:tranId(作为字符串的guid)和perform(要执行的函数)。
我正在尝试在集合中找到与我传递的tranId相匹配的项目......
var tranId = "1a2b3c";
var found = _.find(myCollection, function(item){
return item.tranId === tranId;
});
发现始终是未定义的,即使调试器显示我的集合确实存在,确实有一个项目,其中tranId匹配我的变量。我无法在return语句中设置断点以查看item.tranId等于什么。我也试过这个......
var found = _.find(myCollection, function(item){
return item.get('tranId') === tranId;
});
但是,同样的事情。 'found'总是未定义的。我在这里做错了什么?
答案 0 :(得分:21)
Backbone集合实现many of the Underscore functions,所以你可以这样做:
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;
});
答案 1 :(得分:10)
更简单的一个:
var found = myCollection.findWhere({'tranId': tranId})
有关详细信息,请参阅here。
如果必须使用Underscore方法:
var found = _.find(myCollection.models, function(item){
return item.get('tranId') === tranId;
});
因为myCollection.models是一个数组,myCollection不是。
我更喜欢前者。
答案 2 :(得分:6)
集合在Backbone(管理模型列表的对象)和Underscore(对象列表)中并不完全相同。您传递给_.find
的内容是myCollection.models
_.find(myCollection.models, function(model) {
return model.get('tranId')===tranId;
});
正如@Daniel Aranda解释的那样,Backbone代理Underscore methods on collections你可以把你的例子写成
myCollection.find(function(model) {
return model.get('tranId')===tranId;
});
最后,如果tranId
是您的模型ID,您可以set id as the 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);