javascript - Fabric.js - 等到 loadedSVGFromString 在渲染组之前完成

标签 javascript fabricjs

我正在使用 Fabric.js创建交互式 Canvas 。当用户单击按钮时,我会调用 diagram.js 文件中的 addNewItem 函数。单击此按钮后,我想将一个新组添加到 Canvas 的中心。我遇到的问题是,我想添加到组中的两个元素之一是我通过 Fabric 自己的 loadSVGFromString 方法加载的 SVG。这需要时间才能完成,这意味着在下面的示例中 group 未在 Promise 中定义。

diagram.js(仅显示相关代码)

addNewItem = (e, item) => {
  e.preventDefault();

  drawPlayer(item.svg, this.state.playerIconColor, borderColor, item.sizes[this.state.iconSize].height, item.sizes[this.state.iconSize].width, 'LM')
  .then((newItem) => {
    newItem.hasControls = false;
    canvas
      .add(newItem)
      .centerObject(newItem)
      .setActiveObject(newItem)
      .renderAll();
    newItem.setCoords();
  })
  .catch((notCreated) => {
    alert(notCreated);
  });
}

绘图播放器

import { fabric } from 'fabric';

const drawPlayer = (icon, iconFill, borderColor, height, width, label) => {
  // Create empty group
  let group;

  fabric.loadSVGFromString(icon, (objects, options) => {
    const canvasItem = fabric.util.groupSVGElements(objects, options);
    canvasItem.hasControls = false;
    canvasItem.setFill(iconFill);
    canvasItem.set({ borderColor });
    canvasItem.scaleToHeight(height);
    canvasItem.scaleToWidth(width);

    const playerText = new fabric.Text(label, {
      fontSize: 10,
      originX: 'center',
      originY: 'center',
    });

    group = new fabric.Group([canvasItem, playerText], { left: 200, top: 200 });
  });

  return new Promise((resolve, reject) => {
    if (group.length > 0) {
      resolve(group);
    } else {
      reject('Not created');
    }
  });
};

export default drawPlayer;

最佳答案

您可以在执行 loadSVGFromString 后尝试解析/拒绝 promise 。

import { fabric } from 'fabric';

const drawPlayer = (icon, iconFill, borderColor, height, width, label) => {
  // Create empty group
  let group;
  let groupResolve;
  let groupReject;

  fabric.loadSVGFromString(icon, (objects, options) => {
    const canvasItem = fabric.util.groupSVGElements(objects, options);
    canvasItem.hasControls = false;
    canvasItem.setFill(iconFill);
    canvasItem.set({ borderColor });
    canvasItem.scaleToHeight(height);
    canvasItem.scaleToWidth(width);

    const playerText = new fabric.Text(label, {
      fontSize: 10,
      originX: 'center',
      originY: 'center',
    });

    group = new fabric.Group([canvasItem, playerText], { left: 200, top: 200 });
    if (group.length > 0) {
      groupResolve(group);
    } else {
      groupReject('Not created');
    }
  });

  return new Promise((resolve, reject) => {
    groupResolve = resolve;
    groupReject = reject;
  });
};

export default drawPlayer;

关于javascript - Fabric.js - 等到 loadedSVGFromString 在渲染组之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47198295/

相关文章:

php - 拖放,编辑器

javascript - 自定义 Yeoman 生成器无法覆盖文件

javascript - Fabric js 图像过滤器加载问题

javascript - Fabric 3.4.0 文本格式

javascript - 如何获取组中对象的 Canvas 相对位置?

javascript - 当页面的一部分被溢出 CSS 隐藏时,如何将图像置于浏览器中心?

javascript - Backbone : I am trying to fetch a collection (using a rails server). 但是,我的提取看起来无法正常工作

javascript - 在 fabric.js 中编辑 iTextBox 时阻止事件

javascript - 如何使用 webdriverio 和 appium 按下点击并按住并向下滚动

canvas - 破坏 Canvas