Ошибка TypeError происходит только при отладке
При отладке не связанной с этим проблемы мой код зависал так, как не было до открытия отладчика браузера.
TypeError: Cannot convert undefined or null to object
Ошибка происходит в обработчике событий для перемещения mxCell
,
adjustPortPosition(sender, event)
{
...
for(var i = 0; i < event.properties.cells.length; i++)
{
var node = event.properties.cells[i];
var edges = this.graph.getEdges(node); // crashes here!
...
}
}
Сбой происходит после звонка mxGraph.getEdges
, Когда я вошел в этот вызов, все в этом методе выполнялось без проблем, а возвращаемое значение представляло собой массив из 3 mxCell
объекты, а не undefined
или же null
, getEdges
не появляется в трассировке стека, но строка, на которой он вызывается, появляется. Все, что я делаю, это присваиваю возвращаемое значение переменной, так что даже если это было undefined
или же null
это не должно делать какого-либо преобразования.
Это происходит только при перемещении вершины, имеющей дочерние вершины. Любые вершины в моем графе без детей не приводят к ошибке.
Чтобы сделать ситуацию еще менее понятной, ошибка не возникает последовательно. Не изменяя код, он несколько раз переключался между сбоями каждый раз, когда я перемещал вершину во время отладки и не мог воспроизвести сбой вообще.
Вот mxgraph.getEdges:
mxGraph.prototype.getEdges = function(cell, parent, incoming, outgoing, includeLoops, recurse)
{
incoming = (incoming != null) ? incoming : true;
outgoing = (outgoing != null) ? outgoing : true;
includeLoops = (includeLoops != null) ? includeLoops : true;
recurse = (recurse != null) ? recurse : false;
var edges = [];
var isCollapsed = this.isCellCollapsed(cell);
var childCount = this.model.getChildCount(cell);
for (var i = 0; i < childCount; i++)
{
var child = this.model.getChildAt(cell, i);
if (isCollapsed || !this.isCellVisible(child))
{
edges = edges.concat(this.model.getEdges(child, incoming, outgoing));
}
}
edges = edges.concat(this.model.getEdges(cell, incoming, outgoing));
var result = [];
for (var i = 0; i < edges.length; i++)
{
var state = this.view.getState(edges[i]);
var source = (state != null) ? state.getVisibleTerminal(true) : this.view.getVisibleTerminal(edges[i], true);
var target = (state != null) ? state.getVisibleTerminal(false) : this.view.getVisibleTerminal(edges[i], false);
if ((includeLoops && source == target) || ((source != target) && ((incoming &&
target == cell && (parent == null || this.isValidAncestor(source, parent, recurse))) ||
(outgoing && source == cell && (parent == null ||
this.isValidAncestor(target, parent, recurse))))))
{
result.push(edges[i]);
}
}
return result;
};
Вот трассировка стека:
`Uncaught TypeError: Cannot convert undefined or null to object
at NetView.adjustPortPosition (net-view.js:1805)
at mxGraph.mxEventSource.fireEvent (mxEventSource.js:185)
at mxGraph.moveCells (mxGraph.js:6009)
at mxGraphHandler.moveCells (mxGraphHandler.js:1016)
at mxGraphHandler.mouseUp (mxGraphHandler.js:907)
at mxGraph.fireMouseEvent (mxGraph.js:12612)
at mxCellRenderer.<anonymous> (mxCellRenderer.js:851)
at SVGGElement.<anonymous> (mxUtils.js:208)`