这个问题来自以下背景:
其中一个具有各种属性的过滤器,例如demo-ed here。
对于最小工作示例,我们将考虑所有复选框代表节点的一个类,例如
目标是能够根据此过滤器删除/添加节点。一些节点可能属于多个类。我可以使用hide / show来实现这一点。该代码位于此帖的底部。
在此代码中,当鼠标离开下拉列表时,我有过滤器。可能不理想,但足够。我有一个对象allNodeClasses
,它包含作为属性的类,以及它们是否通过过滤器显示为布尔值,例如。
allNodeClasses = {
class1: true
class2: true,
etc
}
下面的代码可以分为两个主要阶段,即设置和过滤器(分别在cy.batch...
之前和之后)。
首先,我更新布尔对象,看它是否已经检查了它的相应按钮。然后,对于每个节点,我遍历每个类,并查看它是否有一个设置为false的类。如果是,则隐藏节点。如果所有节点的类都为真,则显示(它将恢复任何先前隐藏的节点)。
用hide代替remove并使用show添加/恢复不起作用(删除工作...)。即 - 我相信 - 某些功能对删除的节点不起作用。
因此,我有以下几个问题:
1.。)如何通过删除和添加/恢复来完成这项工作?
2。)是否有一个“吸气者”。对于节点类?因为.classes
似乎只是作为一个设定者,而.class也不起作用。
3。)什么是切换课...因为我认为它可以在这里工作,但在网站演示中没有任何有用的例子可以做到这一点。
问题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();
}
});
});
答案 0 :(得分:2)
只需删除与未经检查的类匹配的元素。
E.g。如果未选中foo和bar,则cy.$('.foo, .bar').remove()
。