mxGraph codec.decode不将单元格添加到实际图形中

时间:2017-10-22 10:00:49

标签: javascript xml mxgraph

我正在尝试加载XML文件并将其转换为mxGraph,但是当我调用编解码器时,它不会更新我的图形。

这是我的函数,其中容器是我的图形所在的div:

function loadXml(container, xml)
{
   // Checks if the browser is supported
   if (!mxClient.isBrowserSupported())
   {
      // Displays an error message if the browser is not supported.
      mxUtils.error('Browser is not supported!', 200, false);
   }
   else
   {
     // Creates the graph inside the given container
     var graph = new mxGraph(container);

     // Adds rubberband selection to the graph
     new mxRubberband(graph);

     var doc = mxUtils.parseXml(xml);
     var codec = new mxCodec(doc);
     codec.decode(doc.documentElement, graph.getModel());
   }
};

PS:我检查了doc.documentElement,看起来是正确的。

2 个答案:

答案 0 :(得分:2)

由于mxGraph是使用Webpack的exports-loader导入的,因此弹出了同样的问题,但我相信它可能会在其他情况下发生。

mxCodec.prototype.decode(doc, graphModel)函数希望所有mxGraph对象/构造函数都可以通过window[objectName]访问器在全局范围内使用。

如果mxGraph封装在模块中,则对象不在全局范围内,解码失败。

要确认这是问题,请在mxGraph的mxCodec.prototype.decode功能中添加断点并加载您的页面。然后,您可以验证是否可以找到对象。

答案 1 :(得分:0)

我知道这个问题很老,但我会为社区提供答案。您可以使用mxUtils.parseXml(xml)函数解析xml字符串并从中获取单元格,然后只需将单元格导入mxGraph对象中,代码如下所示:

// Creates the graph inside the given container
var graph = new mxGraph(container);
let doc = mxUtils.parseXml(xml);
let codec = new mxCodec(doc);
codec.decode(doc.documentElement, graph.getModel());
let elt = doc.documentElement.firstChild;
let cells = [];
while (elt != null)
{  
    let cell = codec.decode(elt)
    if(cell != undefined){
        if(cell.graphname != undefined && cell.geometry != undefined){
            if(cell.id != undefined && cell.parent != undefined && (cell.id == cell.parent)){
                elt = elt.nextSibling;
                continue;
            }
            cells.push(cell);
        }
    }
    elt = elt.nextSibling;
}
graph.addCells(cells);

这应该可以解决问题:)