【问题标题】:Cytoscape.js Compound Child Node addClass Not Displaying StyleCytoscape.js 复合子节点 addClass 不显示样式
【发布时间】:2019-11-05 14:34:50
【问题描述】:

Cytoscape 3.5.0 - 升级到 Cytoscape 3.11.0 - 无变化

复合子节点样式未显示在 addClass 上,但父节点显示

我在 onClick 事件期间成功地向选定的节点元素添加了一个附加类:

 cy.on('click', 'node', (evt) => (...  

但是,单击时我只看到父项上的样式更改,而不是子项。当我单击子节点时,我发现它已经在 console.log 输出中添加了类,就像它为父节点所做的一样,但是我在图中没有看到子节点的预期样式更改就像我为家长所做的那样。

我已经进行了大量实验并通读了文档和示例,但没有成功,但令人困惑的是,父样式会随着 addClass 而改变,而子样式不会。

我很茫然。感谢您对此提供的任何帮助。

控制台日志:

(2) [“控制器”、“选定节点”]
0:“控制器”
1:“选定节点”
长度:2
原型:数组(0)

点击事件:

cy.on('click', 'node',  (evt) => {
    cy.elements().removeClass('selectedNode');
    let selectedNode = cy.$('#'+evt.target.id());
    selectedNode.addClass('selectedNode');
    console.log(selectedNode.classes());
});

选择器类:

{
   selector: '.controller',
   style: {
       'background-color': 'lightgrey',
       'color': '#737373',
       'font-weight': 'bold',
       'background-opacity': 0.115,
       'content': 'data(label)',
       'text-valign': 'bottom',
       'text-wrap': 'wrap',
       'shape': 'roundrectangle',
       'border-width': .001,
       'border-color': 'lightgrey',
       'font-size': 24,
       'height': 46,
       'width': 85,
       'background-image': '/networkdiagram/controller.svg',
       'background-fit': 'cover cover',
    }
},
{
    selector: '.selectedNode',
    style: {
        'border-width': 8,
        'border-color': '#5da963',
    }
}

【问题讨论】:

    标签: javascript css cytoscape.js


    【解决方案1】:

    这里似乎没有太多错误,您可以使用 evt.target 更轻松地访问目标节点(直接无需任何查询)并且我倾向于使用 unbind(只是为了确保我不调用事件处理程序多次):

    var cy = (window.cy = cytoscape({
      container: document.getElementById("cy"),
      style: [{
          selector: "node",
          css: {
            content: "data(id)",
            "text-valign": "center",
            "text-halign": "center",
            height: "60px",
            width: "60px"
          }
        },
        {
          selector: "edge",
          css: {
            label: "\u2B24",
            "curve-style": "bezier",
            "target-arrow-shape": "data(arrow)"
          }
        },
        {
          selector: ".selectedNode",
          style: {
            "border-width": 8,
            "border-color": "#5da963"
          }
        }
      ],
    
      elements: {
        nodes: [{
            data: {
              id: "n0",
              parent: "n4"
            }
          },
          {
            data: {
              id: "n1",
              parent: "n5"
            }
          },
          {
            data: {
              id: "n2",
              parent: "n5"
            }
          },
          {
            data: {
              id: "n3",
              parent: "n5"
            }
          },
          {
            data: {
              id: "n4",
              parent: "n5"
            }
          },
          {
            data: {
              id: "n5"
            }
          }
        ],
        edges: [{
            data: {
              source: "n0",
              target: "n1",
              arrow: "triangle"
            }
          },
          {
            data: {
              source: "n1",
              target: "n2",
              arrow: "triangle"
            }
          },
          {
            data: {
              source: "n1",
              target: "n3",
              arrow: "triangle"
            }
          }
        ]
      },
    
      layout: {
        name: "concentric",
        minNodeSpacing: 140
      }
    }));
    
    cy.unbind("click");
    cy.bind("click", "node", evt => {
      cy.elements().removeClass("selectedNode");
      evt.target.addClass("selectedNode");
    });
    body {
      font: 14px helvetica neue, helvetica, arial, sans-serif;
    }
    
    #cy {
      height: 100%;
      width: 100%;
      left: 0;
      top: 0;
      float: left;
      position: absolute;
    }
    
    .cxtmenu-disabled {
      opacity: 0.333;
    }
    <html>
    
    <head>
      <meta charset=utf-8 />
      <meta name="viewport" content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui">
      <script src="https://cdn.jsdelivr.net/npm/cytoscape@3.10.1/dist/cytoscape.min.js"></script>
    </head>
    
    <body>
      <div id="cy"></div>
    </body>
    
    </html>

    【讨论】:

    • 感谢您加入这个斯蒂芬。我尝试了 cy.bind() 但得到了相同的结果。子节点上没有样式更改,但它显然已经应用了新的类。数组(2)0:“控制器”1:“选定节点”长度:2
    • 它在我的演示中有效,因此您的代码存在其他问题导致此问题。如果您在问题中添加代码,我们可以做更多的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多