Cytoscape.js:获取类并返回已过滤的节点。 (吸气剂不存在?)

时间:2016-11-03 14:00:23

标签: cytoscape.js

这个问题来自以下背景:

其中一个具有各种属性的过滤器,例如demo-ed here

对于最小工作示例,我们将考虑所有复选框代表节点的一个类,例如

enter image description 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

CODE

$('#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();
             }
           });



        });

1 个答案:

答案 0 :(得分:2)

只需删除与未经检查的类匹配的元素。

E.g。如果未选中foo和bar,则cy.$('.foo, .bar').remove()