我正在尝试加载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
,看起来是正确的。
答案 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);
这应该可以解决问题:)