在Backbone Collection上使用Underscore方法'find'

时间:2012-07-16 14:44:51

标签: collections backbone.js find underscore.js

我正在尝试在集合中使用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'总是未定义的。我在这里做错了什么?

3 个答案:

答案 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);

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