114 votes

En Angular, j'ai besoin de rechercher des objets dans un tableau.

Dans Angular, j'ai un objet qui renvoie des tas d'objets ayant chacun une idée (ceci est stocké dans un fichier plat, donc pas de base de données, et je ne semble pas pouvoir utiliser ng-resource Dans mon contrôleur :

$scope.fish = [{category:'freshwater', id:'1', name: 'trout', more:'false'},  {category:'freshwater', id:'2', name:'bass', more:'false'}]

Dans ma vue, j'ai des informations supplémentaires sur le poisson cachées par défaut avec le ng-show more, mais lorsque je clique sur l'onglet simple show more, je voudrais appeler la fonction showdetails(fish.fish_id) . Ma fonction ressemblerait à quelque chose comme :

$scope.showdetails = function(fish_id){  
var fish = $scope.fish.get({id: fish_id}) fish.more = true }}

Maintenant, dans la vue, plus de détails apparaissent. Cependant, après avoir parcouru la documentation, je n'arrive pas à trouver comment rechercher ce tableau de poissons.

Alors comment puis-je interroger le tableau ? Et dans la console, comment puis-je appeler le débogueur pour avoir la $scope objet pour jouer avec ?

211voto

Adrian Gunawan Points 1035

Vous pouvez utiliser le service $filter existant. J'ai mis à jour le truc ci-dessus http://jsfiddle.net/gbW8Z/12/

 $scope.showdetails = function(fish_id) {
     var found = $filter('filter')($scope.fish, {id: fish_id}, true);
     if (found.length) {
         $scope.selected = JSON.stringify(found[0]);
     } else {
         $scope.selected = 'Not found';
     }
 }

La documentation sur Angular est ici http://docs.angularjs.org/api/ng.filter:filter

95voto

migontech Points 678

Je sais si ça peut t'aider un peu.

Voici quelque chose que j'ai essayé de simuler pour vous.

Regardez le jsFiddle ;)

http://jsfiddle.net/migontech/gbW8Z/5/

Création d'un filtre que vous pouvez également utiliser dans 'ng-repeat'.

app.filter('getById', function() {
  return function(input, id) {
    var i=0, len=input.length;
    for (; i<len; i++) {
      if (+input[i].id == +id) {
        return input[i];
      }
    }
    return null;
  }
});

Utilisation dans le contrôleur :

app.controller('SomeController', ['$scope', '$filter', function($scope, $filter) {
     $scope.fish = [{category:'freshwater', id:'1', name: 'trout', more:'false'},  {category:'freshwater', id:'2', name:'bass', more:'false'}]

     $scope.showdetails = function(fish_id){
         var found = $filter('getById')($scope.fish, fish_id);
         console.log(found);
         $scope.selected = JSON.stringify(found);
     }
}]);

Si vous avez des questions, faites-le moi savoir.

22voto

herringtown Points 348

Pour ajouter à la réponse de @migontech et aussi à son commentaire selon lequel vous pourriez "probablement le rendre plus générique", voici une façon de le faire. Ce qui suit vous permettra d'effectuer une recherche par n'importe quelle propriété :

.filter('getByProperty', function() {
    return function(propertyName, propertyValue, collection) {
        var i=0, len=collection.length;
        for (; i<len; i++) {
            if (collection[i][propertyName] == +propertyValue) {
                return collection[i];
            }
        }
        return null;
    }
});

L'appel au filtre deviendrait alors :

var found = $filter('getByProperty')('id', fish_id, $scope.fish);

Notez que j'ai supprimé l'opérateur unaire (+) pour permettre des correspondances basées sur des chaînes de caractères...

13voto

Arun P Johny Points 151748

Une solution simple et facile pourrait ressembler à ceci

$scope.showdetails = function(fish_id) {
    angular.forEach($scope.fish, function(fish, key) {
        fish.more = fish.id == fish_id;
    });
};

7voto

Angularjs a déjà une option de filtrage pour faire cela, https://docs.angularjs.org/api/ng/filter/filter

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