create a circle object and push them in array

Fas*_*ash 8 javascript canvas html5-canvas fabricjs typescript

I need to create circles in canvas using fabric. Every click, there is a circle created. However, if the new circle created it will replace old circle. This my stackblitz demo.

HTML

<canvas #canvas id="canvas" width="900" height="400" >
  <p>Your browser doesn't support canvas!</p>
</canvas>
Run Code Online (Sandbox Code Playgroud)

TS

    this.canvas = new fabric.Canvas('canvas');
    var circle = new fabric.Circle({
    radius: 20,
    fill: '#eef',
    originX: 'center',
    originY: 'center'
});
    var text = new fabric.Text(`${data.data.name}`, {
    fontSize: 30,
    originX: 'center',
    originY: 'center'
});
    this.group = new fabric.Group([circle, text], {
    left: event.e.offsetX,
    top: event.e.offsetY,
    angle: 0
});
console.log(this.group);
this.canvas.add(this.group);

this.canvas.setActiveObject(this.canvas.item[0]);
this.canvas.renderAll();
Run Code Online (Sandbox Code Playgroud)

B. *_*ing 5

问题是您重复创建该Canvas对象,这可能会导致画布元素在不同的实例中被多次绘制。也就是说,每个新实例将仅包含最近的圆,并将覆盖前一个实例。您想要做的是创建一次实例,然后每次都引用该实例。

在上面的代码片段中,它可能看起来像这样:

// Ensures that the instance is only created once!
if(!this.canvas) {
    this.canvas = new fabric.Canvas('canvas');
}

var circle = new fabric.Circle({
    radius: 20,
    fill: '#eef',
    originX: 'center',
    originY: 'center'
});

var text = new fabric.Text(`${data.data.name}`, {
    fontSize: 30,
    originX: 'center',
    originY: 'center'
});

this.group = new fabric.Group([circle, text], {
    left: event.e.offsetX,
    top: event.e.offsetY,
    angle: 0
});

console.log(this.group);
this.canvas.add(this.group);

this.canvas.setActiveObject(this.canvas.item[0]);
this.canvas.renderAll();
Run Code Online (Sandbox Code Playgroud)

我什至在 fork 中向您的 stackblitz 项目添加了相关更改,以帮助说明如何实现这一点。