manette
@RequestMapping(value = "/graphs", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public Collection<Graph> getSkeletonGraph()
{
log.debug("REST request to get current graphs");
return graphService.getSkeletonGraphs();
}
Appel angulaire
$scope.graphs = [];
Graph.getGraphs().$promise.then(function(result)
{
$scope.graphs = result;
});
angular.module('sampleApplicationApp').factory('Graph', function($resource)
{
return {
getGraphs: function() {
return $resource('api/graphs/:id').query();
}
};
})
Je ne sais pas pourquoi en utilisant le filtre, je reçois l'exception.
regardé également dans angular doc https://docs.angularjs.org/error/filter/notarray Mon résultat est un tableau mais je ne sais pas pourquoi je reçois une telle exception.
Exemple de résultat du backend que je reçois.
[{"id":"135520b0-9e4b-11e5-a67e-5668957d0149","area":"Bingo","models":[],"enumerateds":[]},{"id":"0db925e0-9e53-11e5-a67e-5668957d0149","area":"jin","models":[],"enumerateds":[]},{"id":"7a717330-9788-11e5-b259-5668957d0149","area":"Product","models":[],"enumerateds":[]},{"id":"402d4c30-980f-11e5-a2a3-5668957d0149","area":"fgfgfg","models":[],"enumerateds":[]},{"id":"404b77b0-9e53-11e5-a67e-5668957d0149","area":"olah","models":[],"enumerateds":[]},{"id":"cd071b10-9e52-11e5-a67e-5668957d0149","area":"lolo","models":[],"enumerateds":[]},{"id":"d9808e60-9710-11e5-b112-5668957d0149","area":"catalog","models":[],"enumerateds":[]},{"id":"2aaca9f0-97e2-11e5-91cd-5668957d0149","area":"btg","models":[],"enumerateds":[]},{"id":"955e9ed0-978c-11e5-93fd-5668957d0149","area":"promotions","models":[],"enumerateds":[]},{"id":"1e441d60-980f-11e5-a2a3-5668957d0149","area":"hjuhh","models":[],"enumerateds":[]},{"id":"fb96dfe0-978d-11e5-93fd-5668957d0149","area":"voucher","models":[],"enumerateds":[]}]
html
<li ng-repeat="g in graphs track by $index | filter:searchText"></li>
Le problème se produit car vous utilisez track by $index
avant d'appliquer votre filtre. Pour résoudre ce problème, changez votre expression en:
<li ng-repeat="g in graphs | filter:searchText track by $index"></li>
Le track by
expression doit toujours être au dernier, après tous vos filtres. C'est une règle mentionnée dans les documents: ngRepeat
Explication:
Lorsque vous n'utilisez pas track by $index
dans ngRepeat
, l'entrée de tous les filtres utilisés est le tableau, c'est-à-dire si son
ng-repeat="item in items | filter1 | filter2",
alors items
est l'entrée passée aux filtres par défaut et le filtrage est effectué sur cette entrée.
Cependant, lorsque vous utilisez track by $index
, l'entrée des filtres devient $index
au lieu de items
et donc l'erreur:
Tableau attendu (lecture: éléments) mais reçu 0 (lecture: $ index).
Par conséquent, pour contrer cela, le tableau passe d'abord par tous les filtres et le résultat filtré est utilisé avec track by $index
.
J'espère que cela clarifie les choses.
Vous devez toujours utiliser track by
en fin d'expression
<li ng-repeat="g in graphs | filter:searchText track by $index"></li>
Depuis lors de l'évaluation d'une expression pour ng-repeat
angular a besoin du résultat final pour que track by fonctionne. Si vous le fournissez à la fin, votre filtre sera appliqué et track by
est calculé sur la sortie finale. Vous pouvez voir le code source à angular docs.
Selon la documentation de ng-repeat
Si vous travaillez avec des objets qui ont une propriété identifiant, vous devez effectuer le suivi par l'identifiant au lieu de l'objet entier. Si vous rechargez vos données plus tard, ngRepeat n'aura pas à reconstruire les éléments DOM pour les éléments qu'il a déjà rendus, même si les objets JavaScript de la collection ont été remplacés par de nouveaux. Pour les grandes collections, cela améliore considérablement les performances de rendu. Si vous n'avez pas d'identifiant unique, le suivi par $ index peut également améliorer les performances.