151 votes

Limitation du nombre de résultats affichés lors de l'utilisation de ngRepeat

Je trouve le Tutoriels AngularJS difficile à comprendre ; celui-ci me guide dans la création d'une application qui affiche les téléphones. Je suis sur étape 5 et j'ai pensé qu'à titre expérimental, j'allais essayer de permettre aux utilisateurs de spécifier le nombre d'images qu'ils souhaitent voir apparaître. La vue ressemble à ceci :

<body ng-controller="PhoneListCtrl">

  <div class="container-fluid">
    <div class="row-fluid">
      <div class="span2">
        <!--Sidebar content-->

        Search: <input ng-model="query">
        How Many: <input ng-model="quantity">
        Sort by:
        <select ng-model="orderProp">
          <option value="name">Alphabetical</option>
          <option value="age">Newest</option>
        </select>

      </div>
      <div class="span10">
        <!--Body content-->

        <ul class="phones">
          <li ng-repeat="phone in phones | filter:query | orderBy:orderProp">
            {{phone.name}}
            <p>{{phone.snippet}}</p>
          </li>
        </ul>

      </div>
    </div>
  </div>
</body>

J'ai ajouté cette ligne où les utilisateurs peuvent indiquer le nombre de résultats qu'ils souhaitent voir apparaître :

How Many: <input ng-model="quantity">

Voici mon contrôleur :

function PhoneListCtrl($scope, $http) {
  $http.get('phones/phones.json').success(function(data) {
    $scope.phones = data.splice(0, 'quantity');
  });

  $scope.orderProp = 'age';
  $scope.quantity = 5;
}

La ligne importante est :

$scope.phones = data.splice(0, 'quantity');

Je peux coder en dur un nombre pour représenter le nombre de téléphones à afficher. Si je mets 5 dans, 5 seront affichés. Tout ce que je veux faire, c'est lire le nombre dans cette entrée à partir de la vue, et le mettre dans le champ data.splice ligne. J'ai essayé avec et sans guillemets, et aucun ne fonctionne. Comment dois-je m'y prendre ?

348voto

Stewie Points 20312

Un peu plus "à la manière d'Angular" serait d'utiliser le simple limitTo tel que fourni nativement par Angular :

<ul class="phones">
  <li ng-repeat="phone in phones | filter:query | orderBy:orderProp | limitTo:quantity">
    {{phone.name}}
    <p>{{phone.snippet}}</p>
  </li>
</ul>

app.controller('PhoneListCtrl', function($scope, $http) {
    $http.get('phones.json').then(
      function(phones){
        $scope.phones = phones.data;
      }
    );
    $scope.orderProp = 'age';
    $scope.quantity = 5;
  }
);

<a href="http://plnkr.co/edit/7pYWjCqBufRkxKEk23ev?p=preview"><strong>PLUNKER</strong></a>

56 votes

Il est utile de préciser - et de faire gagner quelques minutes à quelqu'un d'autre - que si vous utilisez "track by", il DOIT être le dernier après les filtres.

3 votes

Existe-t-il un moyen d'obtenir le nombre d'éléments disponibles lors de l'utilisation de filter et limitTo ? J'aimerais utiliser limitTo mais prévoyez un bouton "load more" pour augmenter la limite. Ce bouton ne devrait s'afficher que si d'autres enregistrements sont disponibles.

0 votes

Qu'est-ce que filter:query ?

47voto

couzzi Points 3043

C'est un peu tard pour le faire, mais ça a marché pour moi. J'espère que quelqu'un d'autre le trouvera utile.

<div ng-repeat="video in videos" ng-if="$index < 3">
    ...
</div>

2 votes

Je pense que cela serait moins efficace que l'utilisation de limitToFilter s'il s'agit d'un grand tableau, car chaque élément doit être évalué.

3 votes

J'avais un scénario dans lequel je voulais montrer 6 éléments d'un tableau de sauvegarde de beaucoup plus. Utilisation de ng-if="$index < 6" m'a permis de n'afficher que les 6 premiers tout en gardant l'ensemble du tableau interrogeable (j'ai un filtre combiné à un champ de recherche).

0 votes

Ce n'est pas une limite, c'est cacher le résultat entier si le nombre est supérieur à 3.

3voto

Rizo Points 1010

Voici un autre moyen de limiter votre filtre sur le html, par exemple je veux afficher 3 listes à la fois que je vais utiliser limitTo:3

  <li ng-repeat="phone in phones | limitTo:3">
    <p>Phone Name: {{phone.name}}</p>
  </li>

2voto

shaunhusain Points 10933

Stocker toutes vos données au départ

function PhoneListCtrl($scope, $http) {
  $http.get('phones/phones.json').success(function(data) {
    $scope.phones = data.splice(0, 5);
    $scope.allPhones = data;
  });

  $scope.orderProp = 'age';
  $scope.howMany = 5;
  //then here watch the howMany variable on the scope and update the phones array accordingly
  $scope.$watch("howMany", function(newValue, oldValue){
    $scope.phones = $scope.allPhones.splice(0,newValue)
  });
}

EDIT avait accidentellement mis la montre à l'extérieur du contrôleur alors qu'elle aurait dû être à l'intérieur.

1voto

Jek-fdrv Points 114

Cela fonctionne mieux dans mon cas si vous avez un objet ou un tableau multidimensionnel. Elle ne montrera que les premiers éléments, les autres seront simplement ignorés dans la boucle.

.filter('limitItems', function () {
  return function (items) {
    var result = {}, i = 1;
    angular.forEach(items, function(value, key) {
      if (i < 5) {
        result[key] = value;
      }
      i = i + 1;
    });
    return result;
  };
});

Changez 5 sur ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X