Laden von JSON im Canvas mit fabric.js

8

Ich versuche, Daten in JSON zu speichern und mit fabric.js wieder in den Erstellungsbereich zu laden. Ich erhalte immer wieder Fehler wie im folgenden einfachen Code:

%Vor%

Ich bekomme:

%Vor%

Wenn ich mein eigenes JSON benutze, wird es gut validiert, aber ich bekomme immer noch Fehler, wenn ich das verwende was von der Fabric-Methode canvas.toJSON () ausgegeben wurde. Jeder hätte Arbeitsbeispiele zum Zurückladen in eine leere Leinwand, die in einem früheren Canvas-Status in fabric.js gespeichert wurde? Es würde sehr geschätzt werden!

    
Regis Zaleman 31.07.2011, 01:26
quelle

1 Antwort

19

fabric.Canvas#toJSON gibt tatsächlich ein Objekt und keine JSON-Zeichenfolge zurück.

Tut mir leid, wenn das verwirrend ist.

Der Grund dafür ist JSON.stringify . Die Sache mit JSON.stringify ist, dass es benutzerdefinierte Serialisierung unterstützt; Alles, was Sie tun müssen, ist ein Objekt zu übergeben, das toJSON method hat. Und genau das habe ich in Fabric gemacht - fabric.Canvas hat toJSON method, was im Grunde ein Alias ​​für toObject method ist.

Dies ermöglicht uns, Canvas zu serialisieren, indem Sie etwas so einfaches tun wie:

%Vor%

.. wobei canvas eine Referenz auf fabric.Canvas instance ist.

Der Unterschied zwischen toObject und toDatalessObject (sowie toJSON und toDatalessJSON ) besteht darin, dass toDatalessObject anstelle der tatsächlichen Pfaddaten "url" zurückgibt. Dies geschieht, um die Größe der Canvas-Darstellung mit großen Formen zu speichern. Wenn Sie eine große SVG-Form laden, könnten ihre Pfaddaten buchstäblich zu mehreren Millionen Zeichen führen. Wenn Sie später diese Daten serialisieren müssen (zum Beispiel zum Speichern), ist es viel sinnvoller, Pfaddaten durch die URL der SVG-Form zu ersetzen. Stellen Sie sich vor, Sie müssten so große Strings auf den Server hochladen / herunterladen.

Also statt dessen:

%Vor%

Du hättest das:

%Vor%

Beachten Sie, wie groß diese Daten sind und wie klein sie sind, wenn Sie den Pfadblock durch URL ersetzen.

Und das ist eine Darstellung einer sehr einfachen Form.

Die einzige Bedingung hier ist, den "sourcePath" des Objekts mit der Methode setSourcePath zu setzen, bevor toDatalessObject / toDatalessJSON aufgerufen wird ("sourcePath" wird intern in "path" kopiert).

Hoffe, dass dies die Dinge ein wenig aufklärt.

    
kangax 31.07.2011, 22:25
quelle

Tags und Links