anonymoose
anonymoose

Reputation: 1243

Object properties don't persist through JSON save or load

I have a canvas with a drawn object on it. I also have save as JSON and load from JSON functionality. The drawn object is drawn and isn't selectable when you load the app, this is how I want it to remain, but when you load this from JSON it's selectable. How can I make sure that these properties remain through the saving + loading process?

Here is a JSFiddle where you can see what I mean. Note the line; when you load the app, it's untouchable. But if you save the JSON and then load it, the line becomes selectable.

$(function() {
  var canvas = new fabric.Canvas('c');
	
	// Center Line
  var line = new fabric.Line([canvas.width / 2, 0, canvas.width / 2, canvas.height], {
    strokeWidth: 0.1,
    stroke: 'black',
    selectable: false,
  });
  canvas.add(line);

  $('#text').on('click', addtext);

  function addtext() {
    var text = new fabric.IText('Some Text!', {
      left: 10,
      top: 10
    });
    canvas.add(text);
  }

  // From Computer
  document.getElementById('imgLoader').onchange = function handleImage(e) {
    var reader = new FileReader();
    reader.onload = function(event) {
      console.log('fdsf');
      var imgObj = new Image();
      imgObj.src = event.target.result;
      imgObj.onload = function() {
        // start fabricJS stuff

        var image = new fabric.Image(imgObj);
        image.set({
          left: 0,
          top: 0,
          angle: 20,
          padding: 10,
          cornersize: 10
        });
        //image.scale(getRandomNum(0.1, 0.25)).setCoords();
        image.scale(0.2);
        canvas.add(image);

        // end fabricJS stuff
      }

    }
    reader.readAsDataURL(e.target.files[0]);
  }

  // Add Web IMG
  var myImg = 'https://i.imgur.com/q2oGjQ9.jpg';
  $('#addImage').on('click', addImg);

  function addImg() {
    fabric.Image.fromURL(myImg, function(oImg) {
      oImg.scale(0.2);
      canvas.add(oImg);
    });
  }

  // canvas2json
  $("#canvas2json").click(function() {
    var json = canvas.toJSON();
    $("#myTextArea").text(JSON.stringify(json));
    var a = document.createElement("a");
    var file = new Blob([JSON.stringify(json)], {
      type: 'text/plain'
    });
    a.href = URL.createObjectURL(file);
    a.download = 'json.txt';
    a.click();
  });

  // load json2canvas
  $("#loadJson2Canvas").click(function() {
    canvas.loadFromJSON(
      $("#myTextArea").val(),
      canvas.renderAll.bind(canvas));
  });
  $('#jsonload').change(function(e) {
    var file = e.target.files[0];
    if(!file) return;
    var reader = new FileReader();
    reader.onload = function(f) {
      var data = f.target.result;
      canvas.loadFromJSON(
      JSON.parse(data),
      canvas.renderAll.bind(canvas));
    };
    reader.readAsText(file);
    });
    $(this).val(null);
    return;
});
#myTextArea {
  width: 90%;
  height: 200px;
}

canvas {
  border: 1px solid black
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<button id="text">Add Text</button>

<input type="button" id="addImage" value="Add Web IMG"/><input type="file" id="imgLoader"/>
<br>upload json<input type="file" id="jsonload" />

<br/><br/>

<canvas id='c' width=500 height=500></canvas>

<br/>

<button id='canvas2json'>2JSON</button>
<button id='loadJson2Canvas'>2CANVAS</button>

<br/><br/>

<textarea id='myTextArea' onfocus="this.select();" onmouseup="return false;"></textarea>

Upvotes: 1

Views: 1375

Answers (1)

Durga
Durga

Reputation: 15604

var json = canvas.toJSON(['selectable']);

Add additional property selectable, you want to include while doing toJSON().

$(function() {
  var canvas = new fabric.Canvas('c');
	
	// Center Line
  var line = new fabric.Line([canvas.width / 2, 0, canvas.width / 2, canvas.height], {
    strokeWidth: 0.1,
    stroke: 'black',
    selectable: false,
  });
  canvas.add(line);

  $('#text').on('click', addtext);

  function addtext() {
    var text = new fabric.IText('Some Text!', {
      left: 10,
      top: 10
    });
    canvas.add(text);
  }

  // From Computer
  document.getElementById('imgLoader').onchange = function handleImage(e) {
    var reader = new FileReader();
    reader.onload = function(event) {
      console.log('fdsf');
      var imgObj = new Image();
      imgObj.src = event.target.result;
      imgObj.onload = function() {
        // start fabricJS stuff

        var image = new fabric.Image(imgObj);
        image.set({
          left: 0,
          top: 0,
          angle: 20,
          padding: 10,
          cornersize: 10
        });
        //image.scale(getRandomNum(0.1, 0.25)).setCoords();
        image.scale(0.2);
        canvas.add(image);

        // end fabricJS stuff
      }

    }
    reader.readAsDataURL(e.target.files[0]);
  }

  // Add Web IMG
  var myImg = 'https://i.imgur.com/q2oGjQ9.jpg';
  $('#addImage').on('click', addImg);

  function addImg() {
    fabric.Image.fromURL(myImg, function(oImg) {
      oImg.scale(0.2);
      canvas.add(oImg);
    });
  }

  // canvas2json
  $("#canvas2json").click(function() {
    var json = canvas.toJSON(['selectable']);
    $("#myTextArea").text(JSON.stringify(json));
    var a = document.createElement("a");
    var file = new Blob([JSON.stringify(json)], {
      type: 'text/plain'
    });
    a.href = URL.createObjectURL(file);
    a.download = 'json.txt';
    a.click();
  });

  // load json2canvas
  $("#loadJson2Canvas").click(function() {
    canvas.loadFromJSON(
      $("#myTextArea").val(),
      canvas.renderAll.bind(canvas));
  });
  $('#jsonload').change(function(e) {
    var file = e.target.files[0];
    if(!file) return;
    var reader = new FileReader();
    reader.onload = function(f) {
      var data = f.target.result;
      canvas.loadFromJSON(
      JSON.parse(data),
      canvas.renderAll.bind(canvas));
    };
    reader.readAsText(file);
    });
    $(this).val(null);
    return;
});
#myTextArea {
  width: 90%;
  height: 200px;
}

canvas {
  border: 1px solid black
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<button id="text">Add Text</button>

<input type="button" id="addImage" value="Add Web IMG"/><input type="file" id="imgLoader"/>
<br>upload json<input type="file" id="jsonload" />

<br/><br/>

<canvas id='c' width=500 height=500></canvas>

<br/>

<button id='canvas2json'>2JSON</button>
<button id='loadJson2Canvas'>2CANVAS</button>

<br/><br/>

<textarea id='myTextArea' onfocus="this.select();" onmouseup="return false;"></textarea>

Upvotes: 6

Related Questions