Je suis un peu confus sur la façon d'obtenir le key
et value
d'un objet dans angular2 tout en l'utilisant *ngFor
pour itérer sur l'objet. Je sais que dans 1.x angulaire, il y a une syntaxe comme
ng-repeat="(key, value) in demo"
mais je ne sais pas faire la même chose en angular2. J'ai essayé quelque chose de similaire, sans succès:
<ul>
<li *ngFor='#key of demo'>{{key}}</li>
</ul>
demo = {
'key1': [{'key11':'value11'}, {'key12':'value12'}],
'key2': [{'key21':'value21'}, {'key22':'value22'}],
}
Voici un plnkr avec ma tentative: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview
Comment puis-je obtenir key1
et key2
utiliser dynamiquement *ngFor
? Après de longues recherches, j'ai trouvé l'idée d'utiliser des pipes mais je ne sais pas comment m'y prendre. Y a-t-il un tuyau intégré pour faire la même chose dans angular2?
angular
typescript
object
Pardeep Jain
la source
la source
key, value
type de syntaxe de paire de support dans angular2ngFor
, vous devriez regarder cette réponsePipe
pour cela ..Réponses:
Avoir
Object.keys
accessible dans le modèle et l'utiliser dans*ngFor
.la source
*ngFor
s. Les deux premiers à utiliserobjectKeys
, la plupart du temps pas besoin (car c'est juste un tableau).Comme dans la dernière version d'Angular (v6.1.0) , Angular Team a ajouté un nouveau tuyau intégré pour le même nom que
keyvalue
tuyau pour vous aider à parcourir les objets, les cartes et les tableaux, dans lecommon
module du paquet angulaire. Par exemple -Exemple de travail fourchu
consultez-le ici pour plus d'informations utiles -
Si vous utilisez Angular v5 ou une version antérieure ou si vous souhaitez utiliser un tuyau, suivez cette réponse
la source
*ngFor="let item of testObject | keyvalue:keepOriginalOrder"
et dans votre classe définir:public keepOriginalOrder = (a, b) => a.key
Vous pouvez créer un canal personnalisé pour renvoyer la liste des clés pour chaque élément. Quelque chose comme ca:
et l'utiliser comme ça:
Éditer
Vous pouvez également renvoyer une entrée contenant à la fois la clé et la valeur:
et l'utiliser comme ça:
la source
keys.push({key: key, value: value[key]);
*ngFor
expression. Il crée un goulot d'étranglement énorme en termes de performances car il doit générer la collection à chaque fois que le détecteur de changement vérifie les changements.pure:false
au tuyau, cela devient très inefficace. Avez-vous une solution pour mettre à jour le tuyau manuellement chaque fois que je change d'objet (supprimer un élément)?common: NgFor has been removed as it was deprecated since v4. Use NgForOf instead. This does not impact the use of*ngFor in your templates.
( jaxenter.com/road-to-angular-5-133253.html )Mise à jour
Dans 6.1.0-beta.1 KeyValuePipe a été introduit https://github.com/angular/angular/pull/24319
Exemple Plunker
La version précédente
Une autre approche consiste à créer une
NgForIn
directive qui sera utilisée comme:Exemple Plunker
ngforin.directive.ts
la source
Depuis Angular 6.1, vous pouvez utiliser le canal de valeur - clé :
Mais il présente l'inconvénient de trier la liste résultante par valeur de clé. Si vous avez besoin de quelque chose de neutre:
N'oubliez pas de spécifier l' attribut pure: false pipe. Dans ce cas, le canal est invoqué à chaque cycle de détection de changement, même si la référence d'entrée n'a pas changé (c'est le cas lorsque vous ajoutez des propriétés à un objet).
la source
Elaboration de la réponse de @ Thierry avec exemple.
Il n'y a ni tuyau ni méthode intégrés pour obtenir
key and value
de la boucle * ngFor. nous devons donc créer un tuyau personnalisé pour le même. comme l'a dit thierry, voici la réponse avec le code.** La classe pipe implémente la méthode de transformation de l'interface PipeTransform qui prend une valeur d'entrée et un tableau facultatif de chaînes de paramètres et renvoie la valeur transformée.
** La méthode de transformation est essentielle à un tuyau. L'interface PipeTransform définit cette méthode et guide à la fois l'outillage et le compilateur. C'est facultatif; Angular recherche et exécute la méthode de transformation indépendamment. pour plus d'informations concernant les tuyaux, reportez-vous ici
et la partie HTML est:
Working Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview
mise à jour vers RC
comme suggéré par user6123723 (merci) en commentaire voici la mise à jour.
la source
@Marton avait une objection importante à la réponse acceptée au motif que le tuyau crée une nouvelle collection à chaque détection de changement. Je voudrais plutôt créer un HtmlService qui fournit une gamme de fonctions utilitaires que la vue peut utiliser comme suit:
la source
Object.keys(...)
à l'intérieur du * ngFor?TypeError: Cannot read property 'keys' of undefined
. Il ne semble pas être pris en charge dans le modèle.template
option, mais dans le code html réel du modèle? merciSi vous utilisez déjà Lodash, vous pouvez faire cette approche simple qui comprend à la fois la clé et la valeur:
Dans le fichier dactylographié, incluez:
et dans le composant exporté, incluez:
la source
Merci pour le tuyau mais j'ai dû faire quelques changements avant de pouvoir l'utiliser en angulaire 2 RC5. Modification de la ligne d'importation de tuyaux et ajout d'un type quelconque à l'initialisation du tableau de clés.
la source
Aucune des réponses ici n'a fonctionné pour moi hors de la boîte, voici ce qui a fonctionné pour moi:
Créer
pipes/keys.ts
avec du contenu:Ajouter à
app.module.ts
(votre module principal):puis ajoutez à votre tableau de déclarations de module quelque chose comme ceci:
Ensuite, dans votre modèle de vue, vous pouvez utiliser quelque chose comme ceci:
Voici une bonne référence que j'ai trouvée si vous voulez en savoir plus.
la source
#
etc. btw votre réponse est également correcte sans aucun douteIl y a une vraie belle bibliothèque qui fait ça parmi d'autres belles pipes. Cela s'appelle ngx-pipes .
Par exemple, le canal de clés renvoie les clés d'un objet et le canal de valeurs renvoie les valeurs d'un objet:
tuyau de clés
tuyau de valeurs
Pas besoin de créer votre propre pipe sur mesure :)
la source
Utiliser l'index:
Usage:
la source
Voici la solution simple
Vous pouvez utiliser des itérateurs dactylographiés pour cela
la source
changer le type de démonstration en tableau ou itérer sur votre objet et pousser vers un autre tableau
et de html:
la source
Je pense que Object.keys est la meilleure solution à ce problème. Pour tous ceux qui rencontrent cette réponse et essaient de savoir pourquoi Object.keys leur donne ['0', '1'] au lieu de ['key1', 'key2'], un récit édifiant - attention à la différence entre " de "et" dans ":
J'utilisais déjà Object.keys, quelque chose de similaire à ceci:
Cependant, au lieu de
J'avais écrit par inadvertance
qui "a fonctionné" parfaitement bien sans aucune erreur et est retourné
Cela m'a coûté environ 2 heures sur Google et maudire ..
(gifle le front)
la source
vous pouvez obtenir la clé de l'objet dynamique en essayant ceci
la source
Vous devez le faire comme ça pour l'instant, je sais pas très efficace car vous ne voulez pas convertir l'objet que vous recevez de Firebase.
la source