我正在使用 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/