对象属性不会通过JSON保存或加载持久化

时间:2018-04-04 03:55:42

标签: fabricjs

我有一个带有绘制对象的画布。我还保存为JSON并从JSON功能加载。当您加载应用程序时,绘制的对象被绘制并且不可选择,这是我希望它保留的方式,但是当您从JSON加载它时它是可选择的。如何通过保存+加载过程确保这些属性保留?

Here is a JSFiddle你可以看到我的意思。注意这条线;当您加载应用程序时,它是不可触及的。但是如果您保存JSON然后加载它,则该行变为可选择。



$(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>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

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

添加其他属性可选,您希望在执行toJSON()时加入。

&#13;
&#13;
$(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;
});
&#13;
#myTextArea {
  width: 90%;
  height: 200px;
}

canvas {
  border: 1px solid black
}
&#13;
<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>
&#13;
&#13;
&#13;