2013-12-08 10 views
14

Poniższy kod nie działa, ponieważ kolekcja zawiera powtórzeń:ng-repeat nie pracuje nad zbiorami, który zawiera powtórzeń

<div ng-repeat="value in [4, 4]"></div> 

myślę, że następujące powinny działać, ale niestety nie działa:

<div ng-repeat="value in [4, 4] track by $index"></div> 

Czy to błąd?

Czy istnieje sposób użycia ng-repeat w kolekcji zawierającej duplikaty?

Dzięki z góry,

Olivier

Odpowiedz

17

Ta funkcja została dodana do angularjs w nowszych wersjach. chodzi o to, że zasadniczo nie należy wykonywać iteracji nad niektórymi typami pierwotnymi (np. Liczbami), ale nad niektórymi złożonymi obiektami.

z tego, co zrozumiałem, dyrektywa ngRepeat sprawdza odniesienia, a nie rzeczywiste wartości, więc jeśli wykonasz iteracje na niektórych złożonych obiektach, ale spróbujesz zrobić to za pomocą zestawu typów pierwotnych, najprawdopodobniej nie będzie to działać długo jak "wszystkie" wartości różnią się od siebie.

EDIT

Następujące linie są kopie i wklejony z this link (i upewnij się, że używasz wersji stosunkowo up-to-date z angularjs - używam 1.1.5 i wszystko działa doskonale -)

Opis

Występuje, jeśli istnieją zduplikowane klucze w wyrażeniu ngRepeat. Zduplikowane klucze są zbanowane, ponieważ AngularJS używa kluczy do kojarzenia węzłów DOM z elementami.

Domyślnie kolekcje są kodowane przez referencje, co jest pożądane w przypadku większości popularnych modeli, ale mogą być problematyczne dla internowanych typów pierwotnych (odniesienia do udziałów).

Na przykład problem może być wywołany przez ten nieprawidłowy kod:

<div ng-repeat="value in [4, 4]"> 
</div> 

Aby rozwiązać ten problem albo zapewnienia, że ​​elementy w kolekcji mają niepowtarzalną tożsamość obsługi utwór składni, aby określić sposób, aby śledzić powiązanie modeli z DOM.

Aby rozwiązać powyższy przykład można rozwiązać za pomocą utwór $ index, która spowoduje, że przedmioty mają być szyfrowany poprzez ich pozycji w tablicy zamiast ich wartości:

<div ng-repeat="value in [4, 4] track by $index"></div> 
+0

OK, ale nadal "track by $ index" ma działać na int nie? – odwl

+0

'track by $ index' wydaje się być zaimplementowane http://stackoverflow.com/questions/21763136/ –

2

jedna rzecz można dodać "track by $ index", jak w kanale documentation, który zmieni logikę śledzenia na indeks elementu, a nie wartość elementu, ale to wyświetli powtarzające się wartości.Aby wyświetlić tylko unikatowe wartości można odfiltrować unikalne wartości pisząc funkcję jak:

var uniqueValues = function(data){ 
     var check = {}; 
     var uniqueValue = []; 
     for(i-0;i<data.length;i++){ 
      if(!check[data[i]]){ 
       uniqueValue.push(data[i]); 
       check(data[i]) = true; 
      } 
     } 
     return uniqueValue; 
} 

a następnie zrobić NG-repeat w tej sprawie.

Powiązane problemy