Cytoscape.js:获取类和return过滤节点。 (getter 不存在?)
Cytoscape.js: get classes and return filtered nodes. (getter not existent?)
这个问题产生于以下背景:
一个过滤器具有各种属性,例如演示 here。
对于最小的工作示例,我们将考虑所有复选框代表节点的 classes 之一,例如
目标是能够根据此过滤器删除/添加节点。某些节点可能属于多个 classes。我可以让它与 hide/show 一起工作。该代码位于 post.
的底部
在这段代码中,我在鼠标离开下拉菜单时实现了过滤器。可能不理想,但足够了。我有一个对象 allNodeClasses
,其中包含 classes 作为属性以及它们是否通过过滤器显示为布尔值,例如
allNodeClasses = {
class1: true
class2: true,
etc
}
下面的代码可以分为两个主要阶段,设置和过滤器(分别在 cy.batch...
之前和之后)。
首先,我更新布尔对象以判断它的相应按钮是否已被选中。然后对于每个节点,我遍历每个 class,看看它是否有一个设置为 false 的 class。如果是,则该节点被隐藏。如果该节点的所有 classes 都为真,则显示它(这将恢复任何以前的隐藏节点)。
将 remove 替换为 hide 并将 add/restore 替换为 show 无效(删除有效...)。即 - 我相信 - 某些功能在删除的节点上不起作用。
因此我有以下几个问题:
问题
1.) 我怎样才能使用 remove 和 add/restore 来完成这项工作?
2.) 节点 classes 有 'getter' 吗?因为 .classes
似乎仅作为 setter 工作,而 .class 也不起作用。
3.) 什么是切换 class... 因为我认为它可以在这里工作,但网站上没有任何有用的示例演示如何做到这一点。
问题 1 注意:问题 1 的理想解决方案不涉及创建和维护 removedElements 数组。
注意:在我看来,理想的解决方案是具有以下 sudo 代码
for elem in cyGraph \ for every item in the graph
var keepQ = true \ assume default
for class in elem.classes \ for every class that
\ element belongs to
if allClasses[class] == false\ if that class is false
keepQ = false \ we are not to keep it
break \ no need to keep searching
if elem.removedQ && keepQ \ restore only removed elements
\ that we should now keep
elem.restore
if !keepQ \ remove filtered out elements
elem.remove
代码
$('#filter-wrapper').on('mouseleave',function(){
var opts =[];
for (var className in allNodeClasses) {opts.push(className)};
var numOpts = opts.length;
for (var i = 0; i < numOpts; i++) {
allNodeClasses[opts[i]] = document.getElementById('filter-checkbox-'+opts[i]).checked
};
cy.batch(function(){
cy.nodes().forEach(function(node){
var keepQ = true;
for (var i = 0; i < numOpts; i++) {
if (node.hasClass(opts[i]) && !allNodeClasses[opts[i]]) {
keepQ = false;
};
};
if (!keepQ) {
node.hide();
} else {
node.show();
}
});
});
只删除匹配未勾选的元素类。
例如如果未选中 foo 和 bar,则 cy.$('.foo, .bar').remove()
.
这个问题产生于以下背景:
一个过滤器具有各种属性,例如演示 here。
对于最小的工作示例,我们将考虑所有复选框代表节点的 classes 之一,例如
目标是能够根据此过滤器删除/添加节点。某些节点可能属于多个 classes。我可以让它与 hide/show 一起工作。该代码位于 post.
的底部在这段代码中,我在鼠标离开下拉菜单时实现了过滤器。可能不理想,但足够了。我有一个对象 allNodeClasses
,其中包含 classes 作为属性以及它们是否通过过滤器显示为布尔值,例如
allNodeClasses = {
class1: true
class2: true,
etc
}
下面的代码可以分为两个主要阶段,设置和过滤器(分别在 cy.batch...
之前和之后)。
首先,我更新布尔对象以判断它的相应按钮是否已被选中。然后对于每个节点,我遍历每个 class,看看它是否有一个设置为 false 的 class。如果是,则该节点被隐藏。如果该节点的所有 classes 都为真,则显示它(这将恢复任何以前的隐藏节点)。
将 remove 替换为 hide 并将 add/restore 替换为 show 无效(删除有效...)。即 - 我相信 - 某些功能在删除的节点上不起作用。
因此我有以下几个问题:
问题
1.) 我怎样才能使用 remove 和 add/restore 来完成这项工作?
2.) 节点 classes 有 'getter' 吗?因为 .classes
似乎仅作为 setter 工作,而 .class 也不起作用。
3.) 什么是切换 class... 因为我认为它可以在这里工作,但网站上没有任何有用的示例演示如何做到这一点。
问题 1 注意:问题 1 的理想解决方案不涉及创建和维护 removedElements 数组。
注意:在我看来,理想的解决方案是具有以下 sudo 代码
for elem in cyGraph \ for every item in the graph
var keepQ = true \ assume default
for class in elem.classes \ for every class that
\ element belongs to
if allClasses[class] == false\ if that class is false
keepQ = false \ we are not to keep it
break \ no need to keep searching
if elem.removedQ && keepQ \ restore only removed elements
\ that we should now keep
elem.restore
if !keepQ \ remove filtered out elements
elem.remove
代码
$('#filter-wrapper').on('mouseleave',function(){
var opts =[];
for (var className in allNodeClasses) {opts.push(className)};
var numOpts = opts.length;
for (var i = 0; i < numOpts; i++) {
allNodeClasses[opts[i]] = document.getElementById('filter-checkbox-'+opts[i]).checked
};
cy.batch(function(){
cy.nodes().forEach(function(node){
var keepQ = true;
for (var i = 0; i < numOpts; i++) {
if (node.hasClass(opts[i]) && !allNodeClasses[opts[i]]) {
keepQ = false;
};
};
if (!keepQ) {
node.hide();
} else {
node.show();
}
});
});
只删除匹配未勾选的元素类。
例如如果未选中 foo 和 bar,则 cy.$('.foo, .bar').remove()
.