如果选择器不够,那么您可以(1)建议一个新功能来增强边缘 -> 选择器,甚至可能为它制作PR或(2)在style属性上使用函数。
->
例如。对于(2):
{ selector: 'edge', style: { display: edgeIsDisplayed } }
功能可以是任何东西,比如 edgeIsDisplayed(edge) => edge.data('foo') === 'bar' && edge.target().hasClass('baz')
edgeIsDisplayed(edge) => edge.data('foo') === 'bar' && edge.target().hasClass('baz')
看到 http://js.cytoscape.org/#style/mappers
您可以提供过滤方法的功能:
cy.edges().filter(function(ele) { return ele.data('type') == 'blocker' && ele.target().data('status') == 'complete'; })
没有选择器可以提供帮助。
但是,可以避免在数据更改时手动更新两个元素。
每次匹配元素的数据更改时,都会调用样式表值函数。在这些功能中,每次更新节点的数据时都可以更新传入边缘的数据,从而使两者的数据自动保持同步。
var push_status = function(node) { node.incomers('edge').forEach( edge => edge.data('target_status', node.data('status')) ); node.outgoers('edge').forEach( edge => edge.data('source_status', node.data('status')) ); }; cytoscape({ ... style: [ ... { selector: 'node', style: { label: node => { push_status(node); return node.data('id'); }, }, }, { selector: 'edge[type="blocker"][target_status="complete"]', style: { display: 'none', }, }, ... ], ... })
这有资格作为黑客攻击,但它完美无缺。更新节点的数据会更新边缘的数据,从而导致应用或不应用样式。
警惕创建无限循环!特别是,修改节点父节点的数据将触发节点样式的计算。通过更换可以避免这个问题
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)