2012-07-16 158 views
10

我想对集合使用下划线方法“发现”,但它不给我我希望的结果用下划线法“查找”:中的骨干收集

我有没有一个基本模型默认和默认集合。我集合中的模型只有两个属性: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; 
    }); 

但是,同样的事情。 '找到'总是未定义的。我在这里做错了什么?

回答

20

骨干集合实现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; 
}); 
+0

谢谢,这工作。为什么Underscore方法不以相同的方式工作?还应该注意的是,tranId是一个字符串,而不是一个数字。所以,类型转换不是必需的。 – 2012-07-16 15:05:20

+2

@JoelCDoyle如果你想直接使用下划线方法可能会更好地使用myCollection.models,因为它是原始数据你的模型http://backbonejs.org/#Collection-models - 类型转换是为了防止严格的数据分析比较的问题。 :D – 2012-07-16 15:32:07

+0

很酷。非常感谢! – 2012-07-16 20:15:32

5

集合并不意味着完全一样Backbone(一个管理模型列表的对象)和Underscore(对象列表)中的东西。你应该传递给_.findmyCollection.models

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

由于@Daniel阿兰达解释,骨干代理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); 

和小提琴http://jsfiddle.net/rYPLU/

+0

非常好。谢谢! – 2012-07-16 20:21:23

+0

非常有用,谢谢! 正如旁边的评论记住,Backbone模型的默认'idAttribute'是'id'字段,[阅读文档](http://backbonejs.org/#Model-idAttribute)了解更多信息 – enricostn 2014-09-21 12:41:56

10

一个更简单的一个:

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

详见here

如果必须使用下划线方法:

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

因为myCollection.models是一个数组,MyCollection的不是。

我更喜欢前者。

+0

非常好。我喜欢单线解决方案! – 2014-08-05 20:09:40