我想要一个用于边缘匹配的选择器
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"]
但是复制数据违反了我作为软件开发人员的本能。
答案 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')