Fabric.js对象在以编程方式更改属性后消失

时间:2014-03-26 10:16:22

标签: javascript html5 canvas fabricjs

我遇到了Fabric新版本的问题,如1.4.2

以编程方式更改对象属性后,对象从画布中消失。

对于旧版本,作为1.3.7,所有工作都有效,除非我以编程方式在更改后手动调整大小。在这种情况下,对象也会消失)

我有一些输入控件(类型编号)来设置属性,我在这些输入控件中观察onchange事件。更改时调用函数:

function cambiarobjeto()
{

numero=damecapa(); //(I have some canvas in some divs, this function give me what is active canvas at this moment)
var canvasactivo=canvaslist[numero];  //(I assign the active canvas to a variable).

var objetico=0;

if (canvasactivo.getActiveObject())
    {

    //(I assign the active object to a variable)
    objetico=canvasactivo.getActiveObject();

    }

if (objetico!=0)
    {

//(I observer if input controls are not null and are correct. If aren´t, I set the value to actual parameter of the canvas active object)

    if ($('#manual_posicionx').val()=='' || isNaN($('#manual_posicionx').val())) {$('#manual_posicionx').val(objetico.left);}
    if ($('#manual_posiciony').val()=='' || isNaN($('#manual_posiciony').val())) {$('#manual_posiciony').val(objetico.top);}
    if ($('#manual_anchura').val()=='' || isNaN($('#manual_anchura').val())) {$('#manual_anchura').val(objetico.width*objetico.scaleX);}
    if ($('#manual_altura').val()=='' || isNaN($('#manual_altura').val())) {$('#manual_altura').val(objetico.height*objetico.scaleY);}
    if ($('#manual_angulo').val()=='' || isNaN($('#manual_angulo').val())) {$('#manual_angulo').val(objetico.angle);}
    if ($('#manual_angulo').val()<0 ) {$('#manual_angulo').val(0);}
    if ($('#manual_angulo').val()>359) {$('#manual_angulo').val(359);}

//(Assing input values to variables. If don´t do this, object set doesn´t works)

    var x=$('#manual_posicionx').val(),
    y=$('#manual_posiciony').val(),
    w=$('#manual_anchura').val(),
    h=$('#manual_altura').val(),
    a=$('#manual_angulo').val();
    ww=objetico.width;
    hh=objetico.height;

//(Set object properties with the inputs values)

//OPTION 1 (doesn´t works)

    objetico.set(
    {
    left: x,
    top: y,
    scaleX: w/ww,
    scaleY: h/hh,
    angle: a,
    });

//OPTION 2 (doesn´t works)

    objetico.left=x;
    objetico.top=y;
    objetico.scaleX=w/ww;
    objetico.scaleY=h/hh;
    objetico.angle=a;

//(And finally do object setcoords, render canvas and calcoffset)

    objetico.setCoords();
    canvasactivo.renderAll();
    canvasactivo.calcOffset();       
    }

}

有人可以帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

尝试删除角度后的逗号:a在对象中。或者,您可以尝试使用

单独设置每个参数
objectio.set('left', x);
objectio.set('top', y);

等等。您可以做的另一件事是对要设置的所有值进行类型检查,以查看是否所有值都是int类型而不是字符串。我有同样的问题,并意识到我设置的值之一是一个字符串。

希望这会有所帮助。

答案 1 :(得分:1)

非常感谢Benick。

问题不在于set方法,而是在分配给他的值中,因为如你所说,被视为字符串而不是整数。

解决方案很简单,将var assignemet代码更改为:

var x=parseInt($('#manual_posicionx').val()),
y=parseInt($('#manual_posiciony').val()),
w=parseInt($('#manual_anchura').val()),
h=parseInt($('#manual_altura').val()),
a=parseInt($('#manual_angulo').val());

它有效。

但是,在这种结构的旧版本中使用字符串值正常工作很奇怪

再次感谢!