Ext JS 4: Filtering a TreeStore

前端 未结 5 1281
闹比i
闹比i 2020-12-10 07:45

I originally posted this on the Sencha forums here but didn\'t get any responses (other than my own answer, which I will post soon), so I am going to repost it here and see

5条回答
  •  误落风尘
    2020-12-10 08:16

    The above override is great, and it solves some of my problems, however, I found a bug that is hard to find with the above code. After spending half a day, I figured out we need to use slice() to copy the array otherwise some nodes get deleted.

        Ext.override(Ext.data.TreeStore, {
    
          hasFilter: false,
    
          /**
          * Filters the current tree by a function fn
          * if the function returns true the node will be in the filtered tree
          * a filtered tree has also a flat structure without folders
          */
          filterBy: function (fn, scope) {
            var me = this,
                    nodes = [],
                    root = me.getRootNode(),
                    tmp;
    
    
            // the snapshot holds a copy of the current unfiltered tree
            me.snapshot = me.snapshot || root.copy(null, true);
    
    
            tmp = me.snapshot.copy(null, true);
            var childNodes = tmp.childNodes.slice();
            root.removeAll();
            for (var i = 0; i < childNodes.length; i++) {
    
              //Recursively tranverse through the root and adds the childNodes[i] if fn returns true
              this.traverseNode(childNodes[i], root, fn);
            }
    
            return me;
          },
    
          /**
          * Recursively tranverse through the root and adds the childNodes[i] if fn returns true
          */
          traverseNode: function (node, parentNode, fn) {
    
            var me = this;
            if (fn.call(me, node)) {
              parentNode.appendChild(node);
              return true;
            }
    
    
            if (node.hasChildNodes()) {
    
              var t_childNodes = node.childNodes.slice();
              var found = false;
    
              for (var i = 0; i < t_childNodes.length; i++) {
                if (this.traverseNode(t_childNodes[i], node, fn) == true) {
                  found = true;
                }
              }
    
              if (found == true) {
                parentNode.appendChild(node);
                return true;
              }
            }
    
            return false;
          },
    
    
          /**
          * Clears all filters a shows the unfiltered tree
          */
          clearFilter: function () {
            var me = this;
    
            if (me.isFiltered()) {
              me.setRootNode(me.snapshot);
              delete me.snapshot;
            }
    
            return me;
          },
    
          /**
          * Returns true if the tree is filtered
          */
          isFiltered: function () {
            return !!this.snapshot;
          }
        });
    

提交回复
热议问题