renderAll()在fabric.js中不起作用

时间:2017-01-20 23:39:44

标签: javascript canvas fabricjs

我在带有fabric.js的画布上绘制了一个建筑物的六层楼。为了只显示一个楼层,我这样做:

building.selectFloor = function(floorId){

    for (var i = 0; i < floors.length; i++){
        if (floorId == floors[i].name){
            floors[i].visible = true;
        }else{
            floors[i].visible = false;          
        }
    }
    canvas.renderAll();
};

但没有任何变化 - 所有楼层仍然可见。设置为visible = false的楼层消失,直到稍后在窗口调整大小时调用renderAll():

$(window).resize(setSize);
setSize();


function setSize(){
    viewportWidth = $(window).width();
    viewportHeight = $(window).height();
    $appContainer.css({ "width": viewportWidth, "height": viewportHeight}); 
    canvas.setDimensions({ width: viewportWidth, height: viewportHeight });
    if (canvas.building){
        canvas.building.center();
        canvas.building.scaleX = canvas.building.scaleY = (viewportWidth + viewportHeight) / (1920 + 1080);
        canvas.renderAll();
    }
}
然后他们确实消失了。为什么一个renderAll()工作,另一个不工作?我已经尝试在window.timeOut中包装无效的renderAll()以查看延迟是否有帮助,但没有运气。

3 个答案:

答案 0 :(得分:2)

好的 - 所以我最终弄明白了:building是一个似乎被某些内部结构魔法缓存的组,并且正在渲染缓存版本而不是更新版本。要呈现更新版本,您必须执行此操作

canvas.building.dirty = true;
canvas.renderAll();

希望能帮助某人下线。

修改

原来还有一个更简单的解决方案:

canvas.building.objectCaching = false

答案 1 :(得分:0)

有一个新版本将格式更改为:

canvas.requestRenderAll();

答案 2 :(得分:0)

这在以后的版本中对我有用:

// for one canvas
myCanvas.objectCaching = false;

// for all canvas
fabric.Object.prototype.objectCaching = false;

// in both case it still needs to be re-rendered
myCanvas.renderAll();

ps:使用版本 4.2.0