2012-03-22 31 views
6

ho questo modelloOttenere attributi del modello backbone.js

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

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

e una collezione

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

E il resto del mio codice è qui:

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

Quello che ho voglio è semplicemente ottenere gli attributi del modello. Ora ho questo su Firebug. Anche quando l'eseguo sul browser ottengo l'avviso successo e il successivo avviso è indefinita. enter image description here

Questa è l'uscita:

{"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

Questo è solo uno degli elementi che restituisce. Ho appena pubblicato sulla voce in modo che non sarà così a lungo.

risposta

10

Si sta chiamando get sulla vostra collezione (vedi http://documentcloud.github.com/backbone/#Collection-get)

Sembra cosa vuoi veramente eseguire un'iterazione sulla raccolta e chiamare per ottenere ogni articolo

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

In caso contrario, per favore elaborare!

Inoltre, se l'url del modello risponde con un elenco di modelli, è necessario definire l'attributo url nella raccolta anziché nel modello.

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

e la vostra risposta dovrebbe essere un array, con prodotti che come elementi di un array [<item1>, <item2>, ...], piuttosto che un oggetto JSON con {'Items': [<item1>, <item2>, ...] }. Se non si desidera modificare la risposta, sarà necessario implementare la funzione parse nella raccolta (http://documentcloud.github.com/backbone/#Collection-parse).

Inoltre, come cita @chiborg, si chiama get subito dopo fetch (che verrà completato in modo asincrono), quindi non è possibile garantire che i dati siano disponibili.

La soluzione corretta qui è quella di associare un listener 'refresh' alla raccolta.

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

mi dispiace per la parte del modello. Sto solo sperimentando su di esso da quando ho notato che il modello Item non ottiene gli attributi è vuoto. Anche sulla cosa dell'analisi. L'ho provato ma dopo aver eseguito il codice non recupera il modello. L'attributo del modello della raccolta è vuoto "[]", ma ho il modello: Articolo – jongbanaag

+0

Cosa restituisce l'url del modello/raccolta (localhost/InterprisePOS ...)? – jlb

+0

ho aggiunto il codice sopra. – jongbanaag

2

Ciò è dovuto al caricamento del modello in modo asincrono - item.get("ItemCode") funzionerà solo dopo che il modello è stato caricato con fetch. Prova a chiamarlo nella tua funzione onSuccess.

Inoltre, si noti che non aiuterà di inizializzare Item direttamente. Quello che si sta cercando di fare è ottenere un elemento nella raccolta Items e quindi chiamare item.get("ItemCode") su quell'elemento, in questo modo:

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

Ho provato il codice. Ma mi genera un errore che indica che oggetto da (alert (item.get())) non è definito. – jongbanaag

+0

Mi dispiace, non ho guardato il risultato dalla richiesta AJAX. La classe Collection di Backbone.js si aspetta che venga restituita una matrice, non un oggetto in cui gli elementi della raccolta sono nidificati in essa. Puoi cambiare ciò che viene restituito sul lato server, restituendo jsut alla matrice che viene dopo "Items"? – chiborg

Problemi correlati