2017-10-04 7 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 propを持つこれらのオブジェクトに対して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; 
     } 
    }; 
}; 
関連する問題