2012-06-17 5 views
15

Beim Laden der Seite meine Daten über this technique in meine Sammlungen übertragen. Das funktioniert großartig, aber ich stoße auf ein Problem, bei dem ich Submodelle habe, die ebenfalls umgesetzt werden müssen.backbone.js - Verwenden von Parse ohne Aufruf von Abruf

Zum Beispiel gebe ich eine JSON-Sammlung namens Book zurück, und jedes Buch-Array enthält 10-20 Modelle, die sich Pages selbst nennen. Wenn ich versuche, direkt auf Pages zuzugreifen, erhalte ich den Fehler [object][object], da Backbone nicht herausfinden kann, um welchen Objekttyp es sich handelt.

Zuvor, als ich fetch verwendet, würde ich dies umgehen, indem Sie Sammlungen, die eine parse Aktion enthalten. In parse würde ich so etwas wie:

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

Nun, da ich die Daten direkt zugreifen bin und nicht fetch verwenden, impliziert die Dokumentation, dass ich keinen Zugriff mehr auf die parse Methode hat.

Wenn ich nicht fetch verwende oder einen Server beim Laden der Seite aufruft, wie kann ich Submodelle mit dem Beispiel Bücher> Seiten umwandeln?

+0

Wenn Sie Ihre Konstruktor/Initialize-Methode ein wenig anpassen können, können Sie dort sicher Kindmodelle einrichten. Ein wenig mehr Details gegen Ende dieses Beitrags: http://bit.ly/KKHItJ – rjz

+0

Deine _diese Technik_Verbindung ist kaputt – Madbreaks

Antwort

11

Aktualisieren: Diese Antwort ist nicht mehr aktuell, siehe uglymunky's answer für aktuellere Informationen.


Du hast Recht, parse ist only specified to be called during fetch so wird es nicht aufgerufen werden, wenn Sie eine Sammlung von Rohdaten Gebäude sind.

Aber, da Sie die Rohdaten zu steuern, dass Sie Ihre Sammlung Bootstrap verwenden, können Sie Ihre Sammlung nennen parse selbst:

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

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

Ihre parse Methoden (sowohl Sammlung und Modell) sollte sich nicht um ihren aufrufenden Kontext kümmern, also sollte es direkt in Ordnung sein, sie direkt vom Prototyp aus aufzurufen.

+1

Ich denke das ist ungefähr das dritte Mal, dass du mich mit backbone.js gerettet hast. Ich schulde dir noch einmal Danke :) – boolean

56

nicht sicher, ob dies neu ist, aber es sieht so können Sie auch die parse Eigenschaft der Optionen-Parameter auf Ihren Konstruktor auf true gesetzt nur, damit den Konstruktor erzählen Sie Ihre Parse-Methode zu verwenden:

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

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

+1

Hinweis: Dies funktioniert auf dem Sammelersteller auch z. var books = neue Collection_Books (json, {parse: true}); – Element

+2

Dies sollte jetzt die akzeptierte Antwort sein ... – Ben

+0

Dies ist neues Verhalten, Backbone hatte diese Option nicht, wenn die Frage gestellt wurde. Ich denke, wir müssen einfach warten, bis das "Akzeptieren" geschaltet wird. –

Verwandte Themen