“Doublons dans un répéteur ne sont pas autorisés” sur ng-repeat
J'ai de la suite de données json renvoyé d'un service à la demande:
{
"entries": [{
"id": 2081,
"name": "BM",
"niceName": "bodmas"
}]
}, {
"id": 8029,
"name": "Mas",
"niceName": "Masm"
}]
}],
"count": 2
}
Et je suis en train d'essayer le code suivant dans le code html de la boucle grâce à ces données:
<option ng-repeat="entry in entries" value="{{entry.name}}">{{entry.name}}</option>
J'obtiens l'erreur suivante lorsque j'exécute le code:
Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: entry in entries, Duplicate key: string:c
Voici le code de mon contrôleur:
myApp.controller("MyController", ['$scope', '$http', '$log', function($scope, $http, $log){
...
$http.get('https://myServiceURL').success(function(data){
$scope.entries = data;
});
}]);
Quelqu'un pourrait m'aider à comprendre pourquoi j'obtiens cette erreur?
- Ne devriez-vous pas faire
$scope.entries = data.entries;
dans votre contrôleur ? - Votre message d'erreur ne semble pas appartenir à cet extrait de code que vous avez fournis. Il mentionne
make in makes
lorsque votre exemple ditentry in entries
. Avez-vous une liste de chaînes de caractères appeléemakes
portée? Si oui, c'est la chose qui a besoin de l'track by
ajouté. - double possible de Angulaire ng-repeat Erreur "Doublons dans un répéteur ne sont pas autorisés."
- J'ai essayé de simplifier les choses à l'aide de l'entrée pour
make
etentries
pourmakes
, à tort oublié de modifier le message d'erreur. Désolé. - Loggin de données.des entrées est de me donner
undefined
dans le résultat. - J'ai essayé d'utiliser
entry in entries tracy by $index
comme<option ng-repeat="entry in entries track by $index" value="{{$index}}">{{$index}}</option>
et il fonctionne très bien, mais j'ai l'index imprimé pour laoption
élément et sonvalue
, comme1,2,3...
. Je ne pense pas qu'il y aurait une double entrée dans le retourné de données JSON. Pensez-vous que les données retournées pourraient être utilisées de la façon dont je l'utilise. Est son format correct pour être utilisé pour faire une boucle dans un tableau? - Comment imprimer la
name
des entrées dans laoption
élément et sa valeur? - Avez-vous essayez seulement l'ajout de
track by $index
et de ne pas modifier vos autres expressions de$index
? e.g<option ng-repeat="entry in entries track by $index" value="{{entry.name}}">{{$entry.name}}</option>
Vous devez vous connecter pour publier un commentaire.
Votre JSON n'est pas valide et doit être :
Aussi, assurez-vous que vous accédez au document au bon niveau, utilisation :
Ensuite, il devrait fonctionner. Voir ce JSBin.
$scope.entries = data.entries;
dans votre commentaire. L'erreur que je faisais quand j'étais en appelant le service était que j'étais emballage de la réponse JSON dans une fonction de rappel qui, tout en parcourant les$scope.entries
a été à l'origine du problème et de me donnerundefined
pourconsole.log(data.entries);
. Merci:)Ajouter
track by $index
à votre ng répéter ainsi, au lieu de:Essayer:
Il y a d'autres informations à ce sujet dans
la documentation de ce message d'erreur:
value="{{entry.name}}"
et{{entry.name}}
jeu m'des chaînes vides. Il n'y a pas de valeur à l'intérieur d'eux.$scope.entries
a été à l'origine du problème et de me donnerundefined
pourconsole.log(data.entries);
. Merci:)Si je peut ajouter une autre raison pour laquelle cela peut se produire...
Si vous faites cela avec un JS object [] ou {}
et vous êtes de passage dans une directive comme ce
À l'intérieur de la directive, vous devez l'activer myObject de retour dans un objet en faisant cela,
Puis le HTML et ng-repeat travaillera
ngRepeat ne sais pas comment répéter au cours d'une seule chaîne.
Voici ce que l'objet pourrait ressembler avant de $scope.$eval
et après $scope.$eval()
L'erreur type d'une référence qu'il ne peut pas répéter d'une chaîne. Voici l'erreur que j'ai eu.
Il semble que vous avez un problème avec la structure des données dans votre périmètre. Votre exemple JSON montre un objet avec un
entries
de la propriété et uncount
de la propriété. Vous mettez ensuite que l'objet entier à votre portéeentries
. Cela signifie que vous auriez besoin pour accéder aux entréesentries.entries
, avec le comteentries.count
. Peut-être que ce contrôleur est plus proche de ce que tu voulais:track by
si votre tableau est d'un type primitif commestring
.data.entries
etdata.count
sont à la fois de me donnerundefined
comme résultat.$scope.entries
a été à l'origine du problème et de me donnerundefined
pourconsole.log(data.entries);
. Je pourrais accepter qu'une seule réponse, et parce que Goodzilla pensé à elle d'abord, j'ai accepté sa réponse. Veuillez ne me dérange pas. Vous avez été tout aussi utile. Merci 🙂//Pour permettre à ce Service Web pour être appelé à partir d'un script, à l'aide de ASP.NET AJAX,décommentez la ligne suivante.
[Système.Web.Script.Services.ScriptService] ==> Décommentez cette ligne Si vous utilisez .NET Service
doublons dans ng-repeat n'est pas autorisé .
Exemple