2012-06-17 16 views
15

Durante il caricamento della pagina eseguo il bootstrap dei miei dati nelle raccolte tramite this technique. Funziona alla grande, ma mi sto imbattendo in un problema in cui ho sottomodelli che devono essere anche lanciati.backbone.js - utilizzo di parse senza chiamare fetch

Ad esempio, restituisco una raccolta JSON denominata Libro e ogni matrice di libri contiene 10-20 modelli denominati Pagine. Se provo ad accedere direttamente a Pages, ottengo l'errore [object][object] dato che Backbone non riesce a capire quale tipo di oggetto sia.

In precedenza, quando stavo usando fetch, avrei risolto questo problema utilizzando le raccolte che contenevano un'azione parse. In parse vorrei fare qualcosa di simile:

Collection_Books = Backbone.Collection.extend({ 
    model: Model_Book, 
    parse: function (response) { 
     response.Pages = new Collection_Pages(response.Pages); 
     return response; 
    } 
}); 

Ora che sto accedere ai dati direttamente e non tramite fetch, la documentazione implica che non ho più accesso al metodo parse.

Se non si utilizza fetch o si chiama un server al caricamento della pagina, come è possibile eseguire il cast dei sub-modelli utilizzando l'esempio Libri> Pagine?

+0

Se si sta modificando leggermente il metodo di costruzione/inizializzazione, è possibile configurare i modelli figlio in tale posizione. Un po 'più in dettaglio verso la fine di questo post: http://bit.ly/KKHItJ – rjz

+0

Il tuo _questo collegamento tecnica_ è rotto – Madbreaks

risposta

11

Aggiornamento: questa risposta non è più aggiornata, vedere uglymunky's answer per informazioni più aggiornate.


Hai ragione, è parseonly specified to be called during fetch in modo che non verrà chiamato quando si sta costruendo una raccolta di dati grezzi.

Ma, dal momento che è possibile controllare i dati grezzi che si sta utilizzando per l'avvio la vostra collezione, è possibile chiamare il vostro collezione parse te stesso:

var c = new YourCollection(
    YourCollection.prototype.parse([ 
     // attribute data goes here... 
    ]) 
); 

Demo: http://jsfiddle.net/ambiguous/kdaZ3/

vostri parse metodi (sia di raccolta e modello) non dovrebbero preoccuparsi del loro contesto di chiamata quindi chiamarli direttamente dal prototipo dovrebbe andare bene.

+1

Penso che questa sia la terza volta che mi hai salvato con backbone.js. Ti devo ancora un grazie :) – boolean

56

Non so se questo è nuovo, ma sembra che si può anche solo impostare la proprietà parse del parametro opzioni al costruttore per vero, dicendo in tal modo il costruttore di utilizzare il metodo di analisi:

modelInstance = new MyModel(obj, {parse: true}); 

http://backbonejs.org/#Model-constructor

+1

Nota: questo funziona anche per il costruttore della raccolta, ad es. var books = new Collection_Books (json, {parse: true}); – Element

+2

Questa dovrebbe essere la risposta accettata ora ... – Ben

+0

Questo è un nuovo comportamento, Backbone non aveva questa opzione quando veniva posta la domanda. Immagino che dovremo aspettare fino a quando l'accettazione non cambierà. –

Problemi correlati