如何在 ExtJS5 中重绘或重绘表面?

How to redraw or repaint surface in ExtJS5?

我定义了一个绘图面板和一些组件,它们通过 SVG 路径相互连接。移动组件时,我需要在表面上重新绘制连接路径。 有我的画板

{
    xtype : 'panel',
    flex : 5,
    split : true,
    region : 'center',
    plain : true,
    itemId : 'idCenterRegion',
    id : 'centerRegion',
    border : 1,
    layout : {
        type : 'fit',
    },
    defaults : {
        autoScroll : true
    },
    listeners : {
     afterrender : 'setDDTarget'
    },
    items: [{
        xtype : 'draw',
        itemId : 'idDrawPanel',
        renderTo:Ext.getCmp('centerRegion'),
    }]
    }

浮动 windows 正在使用 draw/drop 添加到 centerregion。还有另一个控制器在表面上绘制精灵,

printPath : function(drawItem) {
    var source=drawItem.source;
    var target=drawItem.target;

    var surface = Ext.getCmp('centerRegion').down('draw')
            .getSurface('main');
    var color = "#000";

    var line1,line2;

    var posSource=[];
    var posTarget=[];
    if(source.left<target.left){
        posSource[0]=source.left+source.width;
        posTarget[0]=target.left;
        line1=15;
        line2=-15;
    }else{
        posSource[0]=source.left;
        posTarget[0]=target.left+target.width;
        line1=-15;
        line2=15;
    }

    posSource[1]=source.top+source.height/2;
    posTarget[1]=target.top+target.height/2;

    var path = [ "M", posSource[0],
                 posSource[1], "H",
                 posSource[0] + line1, "L",
                 posTarget[0] + line2, posTarget[1], "H",
                 posTarget[0] ].join(",");

    surface.add({
        type : 'path',
        path : path,
        stroke : color,
        fill : 'none',
        'stroke-width' : 2,
        surface : surface,
    }).show(true);

},

连接此面板上的任何项目时,它会绘制精灵但不会在浏览器上显示。但是如果我重新调整绘图面板或浏览器的大小 window,就会显示精灵, 我找不到它发生的任何原因。

我应该使用不同的方式刷新视图吗?

这是调整屏幕大小之前的结果,但是添加精灵方法成功完成。

这张截图是调整中心区域高度后的截图,如你所见,精灵现在可见了。但是任何事件都不会在调整大小操作时手动触发。

我解决了这个问题, 这看起来像是一个技巧,但绘制容器现在运行良好。 我在绘制容器的 'add' 侦听器上调用了手动绘制容器的 resizeHandler。
在 centerRegion 上添加子项 windows(第一次添加)时,它只会触发一次。

下面是我的解决方案,首先给一个'add listener reference to draw container:

{
    xtype : 'draw',
    itemId : 'idDrawPanel',
    renderTo:Ext.getCmp('centerRegion'),
    listeners : {
      add: 'addToDrawPanel'
    },
}

函数:

addToDrawPanel:function( d, component, index, eOpts ){
    var s=d.getSize();
    var rh= d.getResizeHandler();
    rh.call(d,s);
}