Уничтожьте объект JSON в Fabric.js

Я разрабатываю совместную доску с использованием fabricjs. Когда пользователь создает новый объект, я сериализую его и отправляю его всем другим пользователям.

var rect = new fabric.Rect();
canvas.add(rect);  
socket.emit("newObject", JSON.stringify(rect)); // sends the object to other users

Когда эти пользователи получают сериализованный объект, его следует десериализовать и добавить в свой холст. Каков наилучший способ сделать это? Я не смог найти функцию, которая десериализует один объект, только весь холст (loadFromJSON), поэтому я реализовал нечеткое решение:

function drawRoomObjects(roomObjects){
  var canvasString = "{\"objects\":[";
  for(var roomObjectKey in roomObjects){
    canvasString += roomObjects[roomObjectKey];
  }
  canvasString += "], \"background\":\"\"}";
  var tmpCanvas = new fabric.Canvas();
  tmpCanvas.loadFromJSON(canvasString);
  for(var k in tmpCanvas.getObjects()) {
    canvas.add(tmpCanvas._objects[k]);
  }
  canvas.renderAll();
}

Любые предложения для лучшего способа сделать это?

Ответ 1

Вы можете использовать fabric.util.enlivenObjects для десериализации объектов json. После того, как все объекты десериализованы, вы должны добавить их:

objects.forEach(function(o) {
  canvas.add(o);
});

Вот полный пример - замените obj1, obj2 на ваши объекты. Пример также доступен на jsfiddle.

fabric.util.enlivenObjects([obj1, obj2], function(objects) {
  var origRenderOnAddRemove = canvas.renderOnAddRemove;
  canvas.renderOnAddRemove = false;

  objects.forEach(function(o) {
    canvas.add(o);
  });

  canvas.renderOnAddRemove = origRenderOnAddRemove;
  canvas.renderAll();
});