2016-11-27 4 views
0

ui-select를 사용하여 각도로 작은 프로그램을 작성했습니다. 그리고 또는 검색을 다른 필드 (json의 중첩 필드가 될 수 있음)에서 수행하는 필터를 작성하려고합니다.중첩 된 json을 각도로 검색하기 위해 필터를 작성하는 방법은 무엇입니까?

$scope.contracts = [{ 
    name: "contract1.00", 
    value: 10, 
    id :{ 
    id : 8000, 
    code : 2 
    }, 
    policy : { 
    info : { 
     name : "test1", 
     country : "test" 
    } 
    } 
} 
//other elements.... 
:이 필터를 적용 할

/** 
* AngularJS default filter with the following expression: 
* "person in people | filter: {name: $select.search, age: $select.search}" 
* performs an AND between 'name: $select.search' and 'age: $select.search'. 
* We want to perform an OR. 
*/ 
app.filter('propsFilter', function() { 
    return function(items, props) { 
    var out = []; 

    if (angular.isArray(items)) { 
     var keys = Object.keys(props); 

     items.forEach(function(item) { 
     var itemMatches = false; 

     for (var i = 0; i < keys.length; i++) { 
      var prop = keys[i]; 
      var text = props[prop].toLowerCase(); 
      if (item[prop].toString().toLowerCase().indexOf(text) !== -1) { 
      itemMatches = true; 
      break; 
      } 
     } 

     if (itemMatches) { 
      out.push(item); 
     } 
     }); 
    } else { 
     // Let the output be the input untouched 
     out = items; 
    } 

    return out; 
    }; 
}); 

내 JSON 객체가이 구조를 가지고 :의 GitHub의에서 나는 (그러나 단순한 필드) 비슷한 일을 할 수있는이 필터를 발견 UI-선택

이 'propsFilter'는 간단한 필드에서만 작동하는 것이 문제입니다. 내가 작성하는 경우 그래서,이 :

propsFilter: {name: $select.search, value : $select.search} 

이 correcly 일을하고이 두 필드 (이름 또는 값)의 OR 검색을 할 것입니다. 그러나 나의 예에서는 id.id와 policy.info.name이라는 두 개의 다른 필드를 사용하여 OR 검색을 수행하려고합니다. 여기, 마지막으로

propsFilter: {name: $select.search, value : $select.search, id.id : $select.search, policy.info.name : $select.search } 

내 plunker은 다음과 같습니다 :

그래서, 제가하고 싶은 것은이 같은 라인을 사용하는 것입니다 http://plnkr.co/edit/ej2r7XqeTPOC5d1NDXJn?p=preview

나도 같은 검색 필터에 어떻게 그렇게 할 수 있습니까 ??

+0

좋은 일. 그러나이 질문의 범위는 너무 광범위하게 보인다. – Aravind

+0

어, 네가하고 싶은 말을 이해할 수는 없지만 내 질문은 그다지 크지 않았다. 방금 id.id 및 policy.info.name과 같은 중첩 된 속성에이 필터를 적용 할 수있는 방법을 물었습니다. 재귀 필터와 같은 것을 사용할 수 있다는 것을 알았지 만 실제로 그것에 대해 확신하지는 못했습니다 ... – salamanka44

답변

0

나는 당신의 플 런커를 업데이트했습니다. 먼저 루프가 중단되어 첫 번째 속성 인 name에서만 필터가 작동하고, item[prop] &&의 조건이 추가되어 속성이 항목에없는 경우 오류가 발생하지 않도록

http://plnkr.co/edit/CwNANzodvjnuMCNyJYtA?p=preview

app.filter('propsFilter', function($parse) { 
    return function(items, props) { 
    var out = []; 

    if (angular.isArray(items)) { 
     var keys = Object.keys(props); 

     items.forEach(function(item) { 
     var itemMatches = false; 

     for (var i = 0; i < keys.length; i++) { 
      var prop = $parse(keys[i])(item); 
      var text = props[keys[i]].toLowerCase(); 

      if (prop && prop.toString().toLowerCase().indexOf(text) !== -1) { 
      itemMatches = true; 
      } 
     } 

     if (itemMatches) { 
      out.push(item); 
     } 
     }); 
    } else { 
     // Let the output be the input untouched 
     out = items; 
    } 

    return out; 
    }; 
}); 
+0

대답 해 주셔서 감사합니다! 그러나이 필터는 여전히 id.id 및 policy.info.name과 같은 중첩 된 속성에서 작동하지 않습니다. 그걸 어떻게 해결할 수 있니? 감사합니다 – salamanka44

+0

내가 재귀 필터 또는 그런 것을 사용해야 ???? – salamanka44

+0

키가 "id.id'의 형식 일 수 있기 때문에 나쁘다. 체크하지 않았다. item [ 'id.id']'는 item = { 'id .id ': 1}'item = {id : {id : 1}}'이 아니지만, 아이템' – maurycy

관련 문제