Cytoscape.js cy.style()。fromJson()添加而不是替换?

时间:2017-06-14 15:14:16

标签: css cytoscape.js

我想在Cytoscape.js 3.1图表中将样式与颜色方案分开。根据{{​​3}},我初始化然后添加到cy.style()

var mystyle = [
    {
        "selector": "node",
        "css":
        {
            "border-opacity": 1.0,
            'label': function(ele)
            {
              if(ele.data('Labels_EN')) {return ele.data('Labels_EN')[0];}
              ...
         }, ...
    ];

var bright = [
    {
        "selector": "node",
        "css":
        {"background-color": "white";}
    }];

cy = cytoscape(
    {
        container: mycontainer,
        style: mystyle
    });

cy.style().fromJson(bright).update();

不幸的是,对cy.style().fromJson()的调用似乎会自动调用cy.style().resetToDefault(),因为它会删除现有的样式。 如何防止Cytoscape.js删除我现有的样式,而是使用JSON添加它?我需要这个功能,所以我不必将完整的样式信息放在我的所有配色方案文件中,这使得它更难维护。

P.S。:作为一种解决方法,我合并了两个这样的样式文件:

function mergeJsonArraysByKey(a1,a2)
{
    let map1 = new Map();
    let map2 = new Map();
    for(i=0;i<a1.length;i++) {if(a1[i].selector) {map1.set(a1[i].selector,a1[i]);}}
    for(i=0;i<a2.length;i++) {if(a2[i].selector) {map2.set(a2[i].selector,a2[i]);}}
    let merged = [];
    map1.forEach((value,key,map) =>
    {
        if(map2.has(key))
        {
            merged.push($.extend(true,{},value,map2.get(key)));
        } else
        {
            merged.push(value);
        }
    });
    map2.forEach((value,key,map) =>
    {
        if(!map1.has(key))
        {
            merged.push(value);
        }
    });
    return merged;
}

function initGraph(container, graph)
{
    let merged = mergeJsonArraysByKey(mystyle,bright);
    cy = cytoscape(
    {
        container: container,
        style: merged
    });
 }

1 个答案:

答案 0 :(得分:2)

合并json而不是附加到样式表。你可以用json做任何你想做的事情,而cy.style()只能以特定的方式进行修改以防止出现问题。

cy.style().fromJson( sheetA.concat( sheetB ) )