J'essaie de faire certaines choses dans Angular 2 Alpha 28 et j'ai un problème avec les dictionnaires et NgFor.
J'ai une interface en TypeScript qui ressemble à ceci:
interface Dictionary {
[ index: string ]: string
}
En JavaScript, cela se traduira par un objet qui, avec des données, pourrait ressembler à ceci:
myDict={'key1':'value1','key2':'value2'}
Je veux répéter ceci et essayer ceci:
<div *ngFor="(#key, #value) of myDict">{{key}}:{{value}}</div>
Mais en vain, aucun des éléments ci-dessous n'a fonctionné non plus:
<div *ngFor="#value of myDict">{{value}}</div>
<div *ngFor="#value of myDict #key=index">{{key}}:{{value}}</div>
Dans tous les cas, j'obtiens des erreurs telles que "Jeton inattendu" ou "Impossible de trouver l'objet de support du tube 'iterableDiff'"
Qu'est-ce que j'oublie ici? N'est-ce plus possible? (La première syntaxe fonctionne dans Angular 1.x) ou la syntaxe est-elle différente pour l'itération sur un objet?
Réponses:
Il semble qu'ils ne souhaitent pas prendre en charge la syntaxe de ng1.
Selon Miško Hevery ( référence ):
Donc, pour parcourir votre objet, vous devrez utiliser un "tube". Actuellement, il n'y a aucun tuyau implémenté qui fait cela.
Pour contourner le problème, voici un petit exemple qui itère sur les clés:
Composant:
la source
key
furnumber
et àvalue
mesure,string
mais l'erreur de lancement angulaireexpression has changed after it was checked
? pourquoi donc une idée?Réponse angulaire 6.1.0+
Utilisez le
keyvalue
tuyau intégré comme ceci:ou comme ça:
où se
mySortingFunction
trouve dans votre.ts
fichier, par exemple:Stackblitz: https://stackblitz.com/edit/angular-iterate-key-value
Vous n'aurez pas besoin de l'enregistrer dans aucun module, car les tuyaux angulaires fonctionnent hors de la boîte dans n'importe quel modèle.
Cela fonctionne également pour Javascript-Maps .
la source
implements PipeTransform
dans la définition de la classe (voir angular.io/guide/pipes#custom-pipes )return Object.keys(dict).map(key => ({key, val: dict[key]}))
?essayez d'utiliser ce tuyau
la source
En plus de la réponse de @ obscur, voici un exemple de la façon dont vous pouvez accéder à la fois à
key
et àvalue
partir de @View.Tuyau:
Vue:
Donc, si l'objet devait ressembler à:
Le résultat généré serait:
Prénom: Daario
Nom: Naharis
Prénom: Victarion
Nom: Greyjoy
Prénom: Quentyn
Nom: Ball
la source
<li *ngFor="let u of myObject | keyValueFilter">First Name: {{u.key}} <br> Last Name: {{u.value}}</li>
. +1 de moi.return { 'key' : key, 'value' : value[key] };
Mise à jour: Angular fournit maintenant le tuyau pour couper l'objet json via
keyvalue
:DEMO DE TRAVAIL , et pour plus de détails Lire
Auparavant (pour les versions plus anciennes): Jusqu'à présent, la réponse la meilleure / la plus courte que j'ai trouvée est (sans filtre de canalisation ni fonction personnalisée du côté composant)
DÉMO DE TRAVAIL
la source
let item of myDict | keyvalue
cela a résolu mon problème.Ajout à l' excellente réponse de SimonHawesome . J'ai fait une version succincte qui utilise certaines des nouvelles fonctionnalités dactylographiées. Je me rends compte que la version de SimonHawesome est intentionnellement verbeuse pour expliquer les détails sous-jacents. J'ai également ajouté une vérification anticipée afin que le tuyau fonctionne pour les valeurs fausses . Par exemple, si la carte est
null
.Notez que l'utilisation d'une transformation d'itérateur (comme cela est fait ici) peut être plus efficace car nous n'avons pas besoin d'allouer de la mémoire pour un tableau temporaire (comme cela est fait dans certaines des autres réponses).
la source
PipeTransform
Voici une variante de certaines des réponses ci-dessus qui prend en charge plusieurs transformations (keyval, key, value):
Usage
la source
pure: false
est vraiment important pour les réflexions instantanées.J'ai eu un problème similaire, j'ai construit quelque chose pour les objets et les cartes.
la source
implements PipeTransform
à la définition de classeAngular 2.x && Angular 4.x ne le prennent pas en charge par défaut
Vous pouvez utiliser ces deux canaux pour itérer soit par clé, soit par valeur .
Tuyau de clés:
Tube de valeurs:
Comment utiliser:
la source
Si quelqu'un se demande comment travailler avec un objet multidimensionnel, voici la solution.
Supposons que nous ayons l'objet suivant en service
dans le composant ajouter la fonction suivante
enfin en vue faire suivre
la source
Je me suis déchiré les cheveux en essayant d'analyser et d'utiliser les données renvoyées par une requête JSON / un appel API. Je ne sais pas exactement où je me suis trompé, j'ai l'impression d'avoir encerclé la réponse pendant des jours, chassant divers codes d'erreur tels que:
"Impossible de trouver l'objet de prise en charge du tube 'iterableDiff'"
"Le tableau TYpe générique nécessite un ou plusieurs arguments"
Erreurs d'analyse JSON, et je suis sûr que d'autres
Je suppose que j'ai juste eu la mauvaise combinaison de correctifs.
Voici donc un résumé des pièges et des choses à rechercher.
Tout d'abord, vérifiez le résultat de vos appels API, vos résultats peuvent être sous la forme d'un objet, d'un tableau ou d'un tableau d'objets.
Je ne vais pas trop y entrer, il suffit de dire que l'erreur d'origine de l'OP de ne pas être itérable est généralement due au fait que vous essayez d'itérer un objet, pas un tableau.
Voici certains de mes résultats de débogage montrant les variables des tableaux et des objets
Ainsi, comme nous souhaitons généralement itérer sur notre résultat JSON, nous devons nous assurer qu'il se présente sous la forme d'un tableau. J'ai essayé de nombreux exemples, et sachant peut-être ce que je sais maintenant, certains d'entre eux fonctionneraient en fait, mais l'approche que j'ai suivie était en effet d'implémenter un tube et le code que j'ai utilisé était celui publié par t.888
Honnêtement, je pense que l'une des choses qui m'obtenait était le manque de gestion des erreurs, en ajoutant l'appel `` return undefined '', je pense que nous permettons maintenant d'envoyer des données non attendues au tuyau, ce qui se produisait évidemment dans mon cas. .
si vous ne voulez pas traiter d'argument dans le tube (et regardez, je ne pense pas que ce soit nécessaire dans la plupart des cas), vous pouvez simplement retourner ce qui suit
Quelques notes sur la création de votre tube et de votre page ou composant qui utilise ce tube
est-ce que je recevais des erreurs indiquant que 'name_of_my_pipe' était introuvable
Utilisez la commande 'ionic generate pipe' de l'interface de ligne de commande pour vous assurer que les modules de canalisation.ts sont créés et référencés correctement. assurez-vous d'ajouter ce qui suit à la page mypage.module.ts.
(je ne sais pas si cela change si vous avez également votre propre custom_module, vous devrez peut-être également l'ajouter à custommodule.module.ts)
si vous avez utilisé la commande 'ionic generate page' pour créer votre page, mais que vous décidez d'utiliser cette page comme page principale, n'oubliez pas de supprimer la référence de page de app.module.ts (voici une autre réponse que j'ai publiée concernant ce https: / /forum.ionicframework.com/t/solved-pipe-not-found-in-custom-component/95179/13?u=dreaser
Dans ma recherche de réponses, il existe un certain nombre de façons d'afficher les données dans le fichier html, et je ne comprends pas assez pour expliquer les différences. Vous trouverez peut-être préférable de les utiliser les uns par rapport aux autres dans certains scénarios.
Cependant, ce qui a fonctionné qui m'a permis d'afficher à la fois la valeur et la clé était le suivant:
pour faire l'appel d'API, il semble que vous deviez importer HttpModule dans app.module.ts
et vous avez besoin de Http dans la page à partir de laquelle vous passez l'appel
Lors de l'appel à l'API, vous semblez être en mesure d'accéder aux données enfants (les objets ou les tableaux dans le tableau) de 2 manières différentes, qui semblent fonctionner
soit pendant l'appel
ou lorsque vous affectez les données à votre variable locale
(je ne sais pas si cette variable doit être une chaîne de tableau, mais c'est ce que je l'ai actuellement. Cela peut fonctionner comme une variable plus générique)
Et note finale, il n'était pas nécessaire d'utiliser la bibliothèque JSON intégrée, mais vous pouvez trouver ces 2 appels pratiques pour la conversion d'un objet en une chaîne et vice versa
J'espère que cette compilation d'informations aidera quelqu'un.
la source
la source
Les interfaces dans TypeScript sont une construction de temps de développement (purement pour l'outillage ... 0 impact d'exécution). Vous devez écrire le même TypeScript que votre JavaScript.
la source
Le dictionnaire est un objet, pas un tableau. Je crois que ng-repeat nécessite un tableau dans Angular 2.
La solution la plus simple serait de créer un tube / filtre qui convertit l'objet en un tableau à la volée. Cela dit, vous voudrez probablement utiliser un tableau comme le dit @basarat.
la source
Si vous avez
es6-shim
ou votretsconfig.json
ciblees6
, vous pouvez utiliser ES6 Map pour le faire.la source
Définissez
MapValuesPipe
et implémentez PipeTransform :Ajoutez votre pipe dans votre module pipes. Ceci est important si vous devez utiliser le même tuyau dans plusieurs composants :
Ensuite, utilisez simplement le tube dans votre html avec
*ngFor
:<tr *ngFor="let attribute of mMap | mapValuesPipe">
N'oubliez pas que vous devrez déclarer votre PipesModule dans le composant où vous souhaitez utiliser le tube:
la source
J'allais donc implémenter ma propre fonction d'assistance, objLength (obj), qui ne renvoie que Object (obj) .keys.length. Mais ensuite, quand je l'ajoutais à ma fonction template * ngIf, mon IDE a suggéré objectKeys (). Je l'ai essayé et cela a fonctionné. Suite à sa déclaration, il semble être proposé par lib.es5.d.ts, alors voilà!
Voici comment je l'ai implémenté (j'ai un objet personnalisé qui utilise des clés générées côté serveur comme index pour les fichiers que j'ai téléchargés):
la source