Inna klasa dla ostatniego elementu w ng-repeat


152

Tworzę listę używając ng-powtórzyć coś takiego

  <div ng-repeat="file in files">
   {{file.name}}
   </div>

Ale jeśli chodzi o ostatni element, chciałbym, aby zawierał on klasę ( <div class="last">test</div>). jak mogę to osiągnąć używając ng-repeat?


utknął na tym samym z ostatnich 2 godzin :)
Anshul

Odpowiedzi:


241

Możesz użyć $lastzmiennej wewnątrz ng-repeatdyrektywy. Spójrz na doc .

Możesz to zrobić w ten sposób:

 <div ng-repeat="file in files" ng-class="computeCssClass($last)">
 {{file.name}}
 </div>

Gdzie computeCssClassjest funkcja, controllerktóra przyjmuje jedyny argument i zwraca 'last'lub null.

Lub

  <div ng-repeat="file in files" ng-class="{'last':$last}">
  {{file.name}}
  </div>

1
Patrzyłem na to wcześniej, ale nie mogłem dowiedzieć się, jak dokładnie użyć $ last .. nie ma też zbyt wielu przykładów.
Rahul

@Rahul, zaktualizowałem odpowiedź. Czy rozumiesz, o czym mówię?
Paul Brit

8
tak .. dostałem też inną odpowiedź z grup google <div ng-repeat="file in files" ng-class="{last: $last}"> {{file.name}} </div>
Rahul

1
@Rahul, myślę, że twoja odpowiedź jest lepsza niż moja.
Paul Brit,

@Rahul, rzeczywiście niestety, to działa dla mnie. Co masz w konsoli programisty?
Paul Brit,

23

Jest to łatwiejsze i czystsze dzięki CSS.

HTML:

<div ng-repeat="file in files" class="file">
  {{ file.name }}
</div>

CSS:

.file:last-of-type {
    color: #800;
}

:last-of-typeSelektor jest obecnie obsługiwana przez 98% przeglądarek


3
Rozwiązanie dla angularjs w CSS sposób 👌
Mo.

1
Uwaga: to nie działa, gdy ng-repeatnastępuje po nim <div class="file"><!-- dummy for creating new element --></div>i chcesz oddzielić listę istniejących elementów div .file .
DerMike

1
@DerMike W takim przypadku należałoby umieścić inną klasę na ng-repeatelementach, aby odróżnić je od końcowychdiv
aidan

14

Aby rozwinąć odpowiedź Paula, jest to logika kontrolera, która pokrywa się z kodem szablonu.

// HTML
<div class="row" ng-repeat="thing in things">
  <div class="well" ng-class="isLast($last)">
      <p>Data-driven {{thing.name}}</p>
  </div>
</div>

// CSS
.last { /* Desired Styles */}

// Controller
$scope.isLast = function(check) {
    var cssClass = check ? 'last' : null;
    return cssClass;
};

Warto również zauważyć, że naprawdę powinieneś unikać tego rozwiązania, jeśli to możliwe. Z natury CSS może sobie z tym poradzić, więc tworzenie rozwiązania opartego na JS jest niepotrzebne i niewydajne. Niestety, jeśli potrzebujesz obsługi IE8> to rozwiązanie nie zadziała ( zobacz dokumentację pomocy technicznej MDN ).

Rozwiązanie tylko CSS

// Using the above example syntax
.row:last-of-type { /* Desired Style */ }

Uwaga: rozwiązanie tylko CSS nie działa, jeśli klasa .ng-hide jest zastosowana na ostatnim elemencie, ponieważ: last-child nie przejmuje się tym, czy element jest renderowany na ekranie, czy nie, ale czy jest dosłownie ostatnim element w zestawie w znaczniku. fiddle.jshell.net/p5qe82w4/4
Kerry Johnson

7
<div ng-repeat="file in files" ng-class="!$last ? 'class-for-last' : 'other'">
   {{file.name}}
</div>

To działa dla mnie! Powodzenia!


Więc jeśli nie jest to $ last, ma klasę na koniec, a ostatni element ma klasę other ...
strwoc

2

Możesz użyć limitTofiltra -1do znalezienia ostatniego elementu

Przykład :

<div ng-repeat="friend in friends | limitTo: -1">
    {{friend.name}}
</div>

0

Odpowiedź udzielona przez Fabiana Pereza zadziałała dla mnie, z niewielką zmianą

Edytowany html jest tutaj:

<div ng-repeat="file in files" ng-class="!$last ? 'other' : 'class-for-last'"> {{file.name}} </div>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.