2012-07-16 22 views
10

Estoy tratando de utilizar el método de 'encontrar' subrayado en una colección, pero no me da los resultados que yo esperaba:subrayado Método 'encontrar' en una colección Backbone

Tengo un modelo base sin valores predeterminados y una colección predeterminada. Los modelos de mi colección solo tienen dos atributos: tranId (un guid como cadena) y perform (una función para realizar).

Estoy tratando de encontrar el elemento de la colección que coincide con el tranId que lo paso ...

var tranId = "1a2b3c"; 

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

encontrado siempre es indefinido, a pesar de que el depurador muestra que mi colección hace, de hecho, tiene un ítem en el que la transición coincide con mi variable. No puedo establecer un punto de interrupción en la declaración de devolución para ver a qué item.tranId equivale. También he intentado esto ...

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

Pero, lo mismo. 'encontrado' es siempre indefinido. ¿Qué estoy haciendo mal aquí?

Respuesta

20

colección Backbone implementa many of the Underscore functions, por lo que podría hacer esto:

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

también para depurar si los valores no son lo que se espera tratar:

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

Gracias, eso funcionó. ¿Por qué el método Underscore no funciona de la misma manera? También se debe notar que el tranId es una cadena, no un número. Entonces, el encasillado no es necesario. –

+2

@JoelCDoyle si desea utilizar los métodos de subrayado directamente puede ser mejor utilizar myCollection.models porque es una matriz en bruto de sus modelos http://backbonejs.org/#Collection-models - el tipocast fue en caso de que hubiera problemas con la estricta comparación de tipos de datos. : D –

+0

Cool. Muchas gracias! –

5

Una colección no significa exactamente lo mismo cosa en Backbone (un objeto que administra una lista de modelos) y Underscore (una lista de objetos). Lo que debe pasar a _.find es myCollection.models

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

Como se explicó @ Daniel Aranda, proxies Backbone Underscore methods on collections y usted podría escribir su ejemplo, como

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

Por último, si tranId es tu ID de modelo, usted podría set id as the idAttribute y simplifique todo usando 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); 

Y un violín http://jsfiddle.net/rYPLU/

+0

Excelente. ¡Gracias! –

+0

Muy útil, gracias! Como comentario aparte, recuerde que el 'idAttribute' predeterminado de un modelo Backbone es el campo' id', [lea el documento] (http://backbonejs.org/#Model-idAttribute) para obtener más información – enricostn

10

Una más simple:

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

Ver here para más detalles.

Si debe utilizar el método de subrayado:

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

Debido myCollection.models es una matriz, no myCollection.

Prefiero la anterior.

+0

Muy bonito . ¡Me gusta la solución de una línea! –

Cuestiones relacionadas