2012-03-22 44 views
6

que tengo este modeloObtener atributos del modelo en el Backbone.js

var Item = Backbone.Model.extend({ 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

var onSuccess = function(){ alert("success"); }; 

y una colección

var Items = Backbone.Collection.extend({ 
    model: Item 
}); 

Y el resto de mi código está aquí:

var item = new Item(); 
var items = new Items(); 
item.fetch({ success: onSuccess }); 
alert(items.get("ItemCode")); 

Lo que querer es simplemente obtener los atributos del modelo. Ahora tengo esto en Firebug. También cuando lo ejecuto en el navegador obtengo la alerta éxito y la siguiente alerta es undefined. enter image description here

Ésta es la salida:

{"ErrorMessage":null,"Items":[{"ErrorMessage":null,"CategoryCode":"Event Materials","ClassCode":null,"Components":null,"GroupCode":null,"ImageURL":null,"ItemCode":"ITEM-123","ItemDescription":"Old World Lamppost\u000d\u000a\u000d\u000a","ItemName":"GET123","ItemType":null,"KitItem":null,"Matrix":null,"Prefix":null,"RetailPrice":107.990000,"SalesTaxCode":null,"UPCCode":null,"UnitMeasureCode":"EACH","UnitsInStock":0,"Value":null,"WholesalePrice":95.000000}]} 

NOTA

Eso es sólo uno de los elementos que devuelve. Acabo de publicar en el artículo para que no sea tan largo.

Respuesta

10

Usted está llamando get en su colección (ver http://documentcloud.github.com/backbone/#Collection-get)

Parece que lo que realmente quiere es iterar sobre la colección, y llamar a conseguir en cada elemento

items.each(function(item) { 
    item.get('ItemCode'); 
}); 

Si no es así, por favor Elaborar!

Además, si la URL de su modelo responde con una lista de modelos, debe definir el atributo url en su Colección en lugar de su modelo.

var Items = Backbone.Collection.extend({ 
    model: Item, 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

Y su respuesta debe ser una matriz, con artículos como elementos de la matriz [<item1>, <item2>, ...], en lugar de un objeto JSON con {'Items': [<item1>, <item2>, ...] }. Si no desea modificar la respuesta, deberá implementar la función parse en su colección (http://documentcloud.github.com/backbone/#Collection-parse).

Además, como menciona @chiborg, está llamando al get inmediatamente después de fetch (que se completará de forma asíncrona), por lo que no hay garantía de que sus datos estén disponibles.

La solución adecuada aquí es vincular un oyente de "actualización" en la colección.

items.on('refresh', function() { 
    // now you have access to the updated collection 
}, items); 
+0

disculpa por la parte del modelo. Solo estoy experimentando con esto, ya que noté que el elemento modelo no obtiene los atributos está vacío. También sobre lo de analizar. Lo intenté, pero después de ejecutar el código, no recupera el modelo. El atributo de modelo de la colección está en blanco "[]" pero tengo el modelo: artículo – jongbanaag

+0

¿Qué devuelve su modelo/URL de recopilación (localhost/InterprisePOS ...)? – jlb

+0

Agregué el código de arriba. – jongbanaag

2

Esto se debe a que el modelo se carga de manera asincrónica: item.get("ItemCode") solo funcionará después de que el modelo se haya cargado con fetch. Intenta llamarlo en tu función onSuccess.

Además, tenga en cuenta que no ayudará a inicializar Item directamente. Lo que estamos tratando de hacer es conseguir un elemento de la colección Items y luego llamar item.get("ItemCode") en ese elemento, así:

function onSuccess() { 
    alert('success') 
    var item = items.get(13); // get item with id 13 
    alert(item.get("ItemCode")); 
} 
+0

He intentado su código. Pero arrojo un error que indica que el elemento de (alerta (elemento.get()) no está definido. – jongbanaag

+0

Lo siento, no miré el resultado de la solicitud de AJAX. La clase de Colección de Backbone.js espera que se devuelva una matriz, no un objeto donde los elementos de la colección están anidados. ¿Puedes cambiar lo que se devuelve en el lado del servidor, devolviendo jsut la matriz que viene después de "Artículos"? – chiborg

Cuestiones relacionadas