mxGraph源码学习:mxCell

Posted remo0x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mxGraph源码学习:mxCell相关的知识,希望对你有一定的参考价值。

1. 概览

mxCell是graph model的元素。它们表示graph中的group、vertex和edge的状态。

对于自定义属性,建议使用XML节点作为cell的值。以下代码可用于创建具有XML节点的cell作为值:

var doc = mxUtils.createXmlDocument();
var node = doc.createElement('MyNode')
node.setAttribute('label', 'MyLabel');
node.setAttribute('attribute1', 'value1');
graph.insertVertex(graph.getDefaultParent(), null, node, 40, 40, 80, 30);

要使标签起作用,应重写mxGraph.convertValueToString和mxGraph.cellLabelChanged,如下所示:

graph.convertValueToString = function(cell) 
  if (mxUtils.isNode(cell.value)) 
    return cell.getAttribute('label', '')
  
;

var cellLabelChanged = graph.cellLabelChanged;
graph.cellLabelChanged = function(cell, newValue, autoSize) 
  if (mxUtils.isNode(cell.value)) 
    // clone正确撤消/重做的值
    var elt = cell.value.cloneNode(true);
    elt.setAttribute('label', newValue);
    newValue = elt;
  

  cellLabelChanged.apply(this, arguments);
;

2. 构造

mxCell的构造函数如下:

/**
 * value - 表示cell值的可选对象。
 * geometry - 可选的mxGeometry,用于指定几何体。
 * style - 可选的格式化字符串,用于定义样式
 */
function mxCell(value, geometry, style) 
    this.value = value;
    this.setGeometry(geometry);
    this.setStyle(style);

    if (this.onInit != null) 
        this.onInit();
    

3. 原型属性

列举一些mxCell的原型属性:

// cell的id。默认为null
mxCell.prototype.id = null;

// 用户对象。默认为null
mxCell.prototype.value = null;

// mxGeometry表示cell的几何状态。默认为null
mxCell.prototype.geometry = null;

// 将样式保存为[(stylename|key = value);]形式的字符串。默认值为null
mxCell.prototype.style = null;

// 指定cell是否为vertex。默认值为false
mxCell.prototype.vertex = false;

// 指定cell是否为edge。默认值为false
mxCell.prototype.edge = false;

// 指向父cell
mxCell.prototype.parent = null;

// 指向子cell
mxCell.prototype.children = null;


// 不应在clone中克隆的成员列表。此字段将传递给mxUtils.clone,并且不会在mxCellCodec中保持持久性。
// 这不是所有类的约定,它仅在此类中用于标记瞬态字段,因为js不支持瞬态修饰符。
mxCell.prototype.mxTransient = ['id', 'value', 'parent', 'source',
    'target', 'children', 'edges'];

4. 原型方法

除了原型属性的getter和setter外,列举几个方法的实现:

/**
 * 将指定的edge插入edge数组并返回edge。将更新edge的相应终端参考
 *
 * edge - 要插入edge数组的mxCell
 * isOutgoing - Boolean,指定边是否外支
 */
mxCell.prototype.insertEdge = function (edge, isOutgoing) 
    if (edge != null) 
        edge.removeFromTerminal(isOutgoing);
        edge.setTerminal(this, isOutgoing);

        if (this.edges == null ||
            edge.getTerminal(!isOutgoing) != this ||
            mxUtils.indexOf(this.edges, edge) < 0) 
            if (this.edges == null) 
                this.edges = [];
            

            this.edges.push(edge);
        
    

    return edge;
;

/**
 * 返回cell的克隆。使用cloneValue克隆用户对象。克隆过程中将忽略mxTransient中的所有字段
 */
mxCell.prototype.clone = function () 
    var clone = mxUtils.clone(this, this.mxTransient);
    clone.setValue(this.cloneValue());

    return clone;
;

/**
 * 返回cell用户对象的克隆。
 */
mxCell.prototype.cloneValue = function () 
    var value = this.getValue();

    if (value != null) 
        if (typeof(value.clone) == 'function') 
            value = value.clone();
        
        else if (!isNaN(value.nodeType)) 
            value = value.cloneNode(true);
        
    

    return value;
;

以上是关于mxGraph源码学习:mxCell的主要内容,如果未能解决你的问题,请参考以下文章

mxgraph js如何自动获取全部mxcell,即获取全部的cell.id ,大神们帮帮忙网上找不到,急用!!!

mxGraph源码学习:mxGraph库

mxGraph源码学习:mxGraph

mxGraph源码学习:mxGraph

mxGraph源码学习:mxEventSource

mxGraph源码学习:mxGraphModel