根据边缘数据和目标数据选择边缘

时间:2018-10-02 05:47:25

标签: cytoscape.js

我想要一个用于边缘匹配的选择器

edge[type="blocker"]

具有匹配的目标

node[status="complete"]

换句话说,有一种表达以下内容的有效方法:

cytoscape({
   ...
   style: [
      ...
      {
         selector: '( node -> node[status="complete"] )[type="blocker"]',
         style: {
            display: 'none',
         },
      },
      ...
   ],
   ...
})

documentation中,我看不到这样做的方法。

很明显,我可以将目标的数据复制到节点的数据中并使用以下命令:

edge[type="blocker"][target_status="complete"]

但是复制数据违反了我作为软件开发人员的本能。

4 个答案:

答案 0 :(得分:0)

您可以提供过滤方法的功能:

cy.edges().filter(function(ele) {
    return ele.data('type') == 'blocker' &&
        ele.target().data('status') == 'complete';
})

答案 1 :(得分:0)

这个怎么样 编辑:

b = [[1,2,3], [1,2], [3,5], [2,3,4],[3,4,5]]

print(list(filter(lambda x: len(x) == 3, b)))
# [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

在样式表中,只需定义:

var selectedEdges = cy.nodes("[status= 'complete']").connectedEdges("[type = 'blocker']);
var selectedEdges.addClass('specialSnowflake')

答案 2 :(得分:0)

没有选择器会有所帮助。


但是,可以避免在数据更改时必须手动更新两个元素。

每次匹配元素的数据更改时,都会调用样式表值函数。因此,在其中一项功能中,每次节点数据更新时,都可以更新传入边缘的数据,从而自动保持两者的数据同步。

ele.data('key', val)

这可以算是骇客,但效果很好。更新节点的数据会更新边缘的数据,这将导致适当地应用样式或不应用样式。


当心创建无限循环!特别是,修改节点父节点的数据将触发对节点样式的计算。更换即可避免此问题

// Making changes to a element's data triggers a style recalculation.
// This avoids needlessly triggering the style recalculation.
var set_data = function(node, key, new_val) {
   let old_val = node.data(key);
   if (new_val != old_val)
       node.data(key, new_val);
};

set_data(ele, 'key', val)

使用

package main

import (
    "encoding/csv"
    "log"
    "os"
)

func main() {
    rows := readOrders("Ec2Instances.csv")
}

func readOrders(name string) [][]string {
    f, err := os.Open(name)
    if err != nil {
        log.Fatalf("Cannot open '%s': %s\n", name, err.Error())
    }
    defer f.Close()
    r := csv.NewReader(f)
    r.Comma = ';'
    rows, err := r.ReadAll()
    if err != nil {
        log.Fatalln("Cannot read CSV data:", err.Error())
    }
    return rows
}

答案 3 :(得分:0)

如果选择器不满足要求,则您可以(1)提出一项新功能来增强边缘->选择器,甚至可以为其创建PR,或者(2)在style属性上使用一个函数

例如对于(2):

{ selector: 'edge', style: { display: edgeIsDisplayed } }

函数可以是任何东西,例如edgeIsDisplayed(edge) => edge.data('foo') === 'bar' && edge.target().hasClass('baz')

请参见http://js.cytoscape.org/#style/mappers