2014-12-11 4 views
0

변경할 webapp가 있습니다. 내가 NG 반복 일부 변경 한 새로운 JSON은 다음과 같습니다 :이 같은AngularJS 부모의 색인을 얻는 방법

[ 
    { 
     "styl":"nowoczesny", 
     "dzieci":[ 
     { 
      "id":53, 
      "bookmark":true, 
      "rodzina":"Nekko", 
      "page":1 
     }, 
     { 
      "id":69, 
      "bookmark":true, 
      "rodzina":"Krak", 
      "page":2 
     }, 
     { 
      "id":81, 
      "bookmark":true, 
      "rodzina":"Oxen", 
      "page":3 
     }, 
     { 
      "id":93, 
      "bookmark":true, 
      "rodzina":"Spirala", 
      "page":4 
     } 
     ] 
    }, 
    { 
     "styl":"klasyczny", 
     "dzieci":[ 
     { 
      "id":109, 
      "bookmark":true, 
      "rodzina":"Vello", 
      "page":5 
     }, 
     { 
      "id":127, 
      "bookmark":true, 
      "rodzina":"Renzo", 
      "page":6 
     }, 
     { 
      "id":135, 
      "bookmark":true, 
      "rodzina":"Zenit", 
      "page":7 
     } 
     ] 
    } 
] 

HTML :

<ul> 

    <li ng-repeat="l in list"> 
     {{l.styl}}&nbsp; 
    <ul> 
     <li ng-repeat="dziecko in l.dzieci | filter:search " 
      ng-class="{active:isActiveTab(dziecko)}" ng-click="openItem(dziecko)"> 
           {{dziecko.rodzina}}&nbsp; 
           <b>{{dziecko.page}}</b> 
     </li> 
    </ul> 
    </li> 

모든 것이 openItem 방법에도 불구하고 잘 작동, 그 첫 번째 버전은 다음과 같습니다 :

$scope.openItem = function(item) { 

     var index = $scope.list.indexOf(item), 
       length = $scope.list.length; 

     $scope.opened = item; 
     $scope.next = $scope.list[index+1]; 
     $scope.prev = $scope.list[index-1]; 
    }; 

위의 html 코드와 호환되도록 수정하려면 어떻게해야합니까? 나는 $ index를 시도하지만 각도는 에러를 던집니다. (목록에서 하위 li 항목을 클릭하면 새 pdf 페이지를 열어야합니다.)

미리 Thx!

+0

정확히 당신이'openItem' 방법으로해야합니까? – Rasalom

+0

새 JSON 구조 [{a, children : [1, b, c]}]를 지원하도록 수정해야합니다. 위와 같이 바꿉니다. var var index = $ scope.list.indexOf (item) 중첩 된 자식 인덱스를 가져옵니다.이 줄은 dzieci 배열에서 수준 2가 아닌 수준 1에서 검색하므로 -1을 반환합니다. "디제이 (Dzieci)"는 부모의 또 다른 물건 내부에있는 똑같은 제품들입니다. – kuba0506

답변

0

$index은 필요한 항목의 색인이어야하지만, $ scope에서 가져 오려면 상위 노드의 색인도 필요합니다. $ parent로 사용할 수 있습니다. 중첩 된 ng-repeat의 $ index (세부 사항 here). 올바르게 국경 인덱스 작동합니다 옆에 HTML

<li ng-repeat="l in list"> 
     {{l.styl}}&nbsp; 
    <ul> 
     <li ng-repeat="dziecko in l.dzieci | filter:search " 
      ng-class="{active:isActiveTab(dziecko)}" ng-click="openItem($parent.$index, dziecko)"> 
           {{dziecko.rodzina}}&nbsp; 
           <b>{{dziecko.page}}</b> 
     </li> 
    </ul> 
</li> 

JS

$scope.openItem = function(parentIndex, item) { 

    var index = $scope.list[parentIndex].dzieci.indexOf(item), 
     length = $scope.list.length; 

    $scope.opened = item; 
    if(index == 0) { 
     $scope.next = $scope.list[index+1]; 
    $scope.prev = $scope.list[$scope.list.length - 1]; 
    } else if(index == $scope.list.length - 1) { 
    $scope.next = $scope.list[0]; 
    $scope.prev = $scope.list[index-1]; 
    } else { 
    $scope.next = $scope.list[index+1]; 
    $scope.prev = $scope.list[index-1]; 
    } 
}; 

이전을 유지하고 :

그래서 코드는 다음과 같이 될 것입니다.

codepen : http://codepen.io/anon/pen/gbrrgQ

+0

console.log (index)는 적절한 숫자를 표시하지만 AngularJS는 을 던집니다. Error : $ scope.list [parentIndex] .dzieci.indexOf (item) console.log .list [parentIndex] 정의되지 않았습니다 – kuba0506

+0

다음 문제가 어딘가에 있어야합니다, 여기 콘솔 로그를 참조하십시오 : http://codepen.io/anon/pen/NPNNNV – Rasalom

+0

그것은 codepen에서 작동하지만 당신은 $ scope.next를 변경하지 않았습니다. = $ scope.list [index + 1]; $ scope.prev = $ scope.list [index-1]; ? ~ $ scope.next = $ scope.list [parentIndex] .dzieci [index + 1]; \t \t // $ scope.prev = $ scope.list [parentIndex] .dzieci [index-1]; – kuba0506

관련 문제