【问题标题】:Fabricjs - Can't select object after fabric.util.enlivenObjectsFabricJs - 无法在Fabric.util.enlivenObject后选择对象
【发布时间】:2016-07-13 17:34:12
【问题描述】:

我目前正在尝试使用这样的 enlivenObjects 加载 fabricjs 对象:

fabric.util.enlivenObjects(elements, function(objects) {
    objects.forEach(function(o) {
        canvas.add(o);
    });
});

问题是,在这些对象被添加并显示在画布上之后,我无法与它们交互,即使对象和画布的“可选”属性设置为 true。

即使我调用 'fabric.renderAll();'之后。

问题可能与加载对象的oCoords属性都是'NaN'有关

oCoords: Object
    bl : n
        corner : Object
        x : NaN
        y : NaN
...

我试图用 'o.setCoords();' 来解决这个问题在 forEach 循环中,但这些值仍然是 NaN。

你知道为什么我不能与那些对象交互吗?

谢谢你们!!

更新

我在prototype.toObject 覆盖中添加了oCoords 属性:

fabric.Object.prototype.toObject = (function (toObject) {
    return function () {
        return fabric.util.object.extend(toObject.call(this), {
                     oCoords: this.oCoords
        });
    };
})(fabric.Object.prototype.toObject);

现在 oCoords 值在 fabric.util.enlivenObjects(elements, function(objects) { ...

之前的 'elements' 对象数组中设置

但是,在将对象添加到画布之后,所有 oCoords 值仍然是 NaN。我再次尝试在 forEach 循环中使用 setCoords 但没有成功..

更新 2

嗯.. 我的jsfiddle 确实有效

我没有在我的应用程序中使用完全相同的代码。但我无法解决我的问题,这一定与我使用 angular 与 fabricjs 交互的事实有关。

我会告诉你的......

【问题讨论】:

  • 你发现了吗?
  • 不是真的,我只是放弃了,因为它在 jsfiddle 上运行良好。我仍然认为这与我过去使用 angular 与 fabricjs 交互的方式有关。我在织物元素上手动添加了属性 (element.set('xxx', yyy);),我认为这种行为导致了我的渲染问题。

标签: javascript fabricjs


【解决方案1】:

您应该在 oCoords 对象 x & y 属性上有值。

我看到您正确使用了 enliveObjects() 函数,只需将 canvas.renderAll() 添加到其中即可:

     fabric.util.enlivenObjects([tmpObject], function (objects) {               
            console.log(objects);
            objects.forEach(function (o) {
                   canvas.add(o);
                   console.log(o);
            });

           canvas.renderAll();
     });

在执行 enliveObjects() 函数之前,您是否检查过织物对象上是否存在这些值?

更新

您最好扩展 toObject() 函数并传递您需要导出的属性,例如:

A.您只能在对象上执行此操作:

canvas.getActiveObject().toObject = (function (toObject) {
                                    return function () {
                                        return fabric.util.object.extend(toObject.call(this), {
                                            oCoords: this.oCoords
                                        });
                                    };
                                })(canvas.getActiveObject().toObject);

B.或者您可以覆盖prototype.toObject 以影响所有对象

fabric.Object.prototype.toObject = (function (toObject) {
    return function () {
        return fabric.util.object.extend(toObject.call(this), {
                     oCoords: this.oCoords
        });
    };
})(fabric.Object.prototype.toObject);

【讨论】:

  • 我将 canvas.renderAll() 添加到函数中但没有成功。事实证明,织物对象的 oCoords 值没有在函数之前设置。当我们使用 toObject 函数将值导出为 JSON 时应该设置这些值,或者我们需要扩展 fabric.Object.prototype.toObject 以保留这些数据?谢谢老哥!
  • 我更新了我的答案,最好覆盖 toObject()
  • oCoords 值在 enlienObjects 函数之后仍然是 NaN。我已经更新了我的问题。
  • 奇怪,你能做一个 jsfiddle 例子来更好地检查它吗?
  • 嗯.. 它实际上是我的 jsfiddle.. 见更新 2
猜你喜欢
  • 2017-06-18
  • 2015-04-22
  • 2019-01-25
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2018-09-25
相关资源
最近更新 更多