2017-10-04 120 views
0

我有一個位於ng-repeat上的篩選器,它將所有對象(包括嵌套對象)的字符串與搜索字符串進行比較。如果在對象中找到搜索字符串,則返回true。篩選嵌套對象以返回所有子元素

我正在尋找一種方法來擴展此功能,以便當搜索字符串與對象中的字符串匹配時,過濾器將爲該對象返回true,並將爲匹配對象中的所有嵌套對象返回true(這是一個樹形視圖,我正在搜索一個節點,並希望在匹配時顯示所有子節點)。

我該怎麼做?

我的過濾器看起來是這樣的:

.filter('deepFilter', function ($filter) { 
    return function(text) { 
     return function (value) { 
      if(text && text.length > 0) { 
       var searchTerm = text; 
       if (angular.isObject(value)) { 
        var found = false; 
        angular.forEach(value, function(v) { 
         found = found || $filter('deepFilter')(searchTerm)(v); 
        }); 
        return found; 

       } else if (angular.isString(value)) { 
        if (value.indexOf(searchTerm) !== -1) { 
         return true; 
        } else { 
         return false; 
        } 
       } 
      } else { 
       return true; 
      } 
     }; 
    }; 
    }); 

回答

0

我找到的解決方案是通過使用過濾器的isString部分功能,並遍歷集合。如果我找到該對象,我使用遞歸函數查找它的孩子,併爲這些屬性設置一個visibleAsAChild屬性。然後,我在isObject評估中添加了一個條件,以便爲具有visibleAsAChild支柱的這些對象返回true。 我不確定這是否是最有效的方法,但它確實有效。

.filter('deepFilter', function ($filter) { 
var currentObject; 
var setChildrenToVisible = function(node) { 
    angular.forEach(node.nodes, function(node) { 
    if(node.nodes) { 
     setChildrenToVisible(node); 
    } 
    node.visibleAsAChild = true; 
    }); 
}; 
var lookupChildren = function(o, value) { 
    // console.log(o); 
    angular.forEach(o.nodes, function(node) { 
    if (node.name === value) { 
     setChildrenToVisible(node); 
    } 
    }); 
}; 

return function(text) { 

    return function (value) { 

     if(text && text.length > 0) { 
      var searchTerm = text; 
      if (angular.isObject(value)) { 
       var found = false; 
       angular.forEach(value, function(v) { 
       found = found || $filter('deepFilter')(searchTerm)(v); 
       }); 
       if(found && value.hasOwnProperty('id')) { 
       currentObject = value; 
       } 
       if(value.hasOwnProperty('id') && value.visibleAsAChild) { 
       return true; 
       } 
       return found; 

      } else if (angular.isString(value)) { 
       if (value.indexOf(searchTerm) !== -1) { 
       if(currentObject){ 
        lookupChildren(currentObject, value); 
       } 
        return true; 
       } else { 
        return false; 
       } 
      } 
     } else { 
      return true; 
     } 
    }; 
};