Je veux manipuler des éléments dans une liste qui est générée avec une boucle for ( ngFor ). Mais pour le moment, cela change tous mes articles si je veux en changer un. Comment puis-je l'habiller uniquement pour un article, de sorte qu'un article change de couleur et d'icône?
html
public added: boolean = true;
...
onAdd(id: number): void {
this.added = !this.added;
}
ts
<ion-list>
<ion-item *ngFor="let friend of loadedFriends; let i = index">
<ion-label text-wrap>
<h2 class="title">Friend</h2>
<p class="status"> Status</p>
</ion-label>
<ion-buttons>
<ion-button size="large" (click)="removeFriend(i)" (click)="onAdd(i)" slot="icon-only">
<ion-icon [color]="added ? 'primary' : 'light'" [name]="added ? 'add-circle-outline' : 'checkmark-circle-outline'"></ion-icon>
</ion-button>
</ion-buttons>
</ion-item>
</ion-list>
3 Réponses :
Vous devez garder une trace de l'état ajouté pour chaque élément de votre boucle.
Voici un moyen de le faire:
<ion-list>
<ion-item *ngFor="let friend of loadedFriends; let i = index">
<ion-label text-wrap>
<h2 class="title">Friend</h2>
<p class="status"> Status</p>
</ion-label>
<ion-buttons>
<ion-button size="large" (click)="removeFriend(i)" (click)="onAdd(i)" slot="icon-only">
<ion-icon [color]="loadedFriendsMap[i] ? 'primary' : 'light'" [name]="loadedFriendsMap[i] ? 'add-circle-outline' : 'checkmark-circle-outline'"></ion-icon>
</ion-button>
</ion-buttons>
</ion-item>
<ion-list>
loadedFriendsMap: { [k: string]: boolean } = {};
/* ... */
onAdd (friendId) {
this.loadedFriendsMap[friendId] = true;
}
removeFriend (friendId) {
this.loadedFriendsMap[friendId] = false;
}
/* ... */
sharedFriendsMap: {[k: id]: boolean} = {}; cela me donne une erreur: cet id n'a pas été trouvé et qu'un type de paramètres de signature d'index doit être de type string ou de type number
@ ColinRagnarök désolé! Cela aurait dû être string . J'ai mis à jour ma réponse.
Cela fonctionne maintenant pour l'ajouter, de sorte que l'icône se transforme en coche, mais je ne peux plus la remplacer par l'icône plus avec la couleur principale
Je l'ai changé en: onAdd (friendId) {this.loadedFriendsMap [friendId] =! This.loadedFriendsMap [friendId]; } maintenant je peux le modifier
C'est parce que la variable ajoutée est en quelque sorte globale et n'est liée à aucun objet. Une autre façon de résoudre ce problème est d'ajouter cette variable / attribut à tous les objets.
onAdd(friendObj): void {
friendObj.added = !friendObj.added;
}
Et la méthode onAdd ressemblera à celle ci-dessous. et en HTML, la méthode onAdd sera transmise comme ceci: onAdd (ami) au lieu de onAdd (i).
for(i = 0; i < loadedFriends.length; i++){
loadedFriends[i].added = false;
}
Je pense que cette approche est meilleure car l'attribut est lié à l'objet lui-même qui vous donne plus de contrôle que de maintenir un tableau / hash-map séparé.
Vous devez obtenir l'index ajouté et le stocker dans une variable si vous ne voulez en sélectionner qu'une à la fois.
eg.
Html
public addedIndex: boolean = true;
...
onAdd(id: number): void {
this.addedIndex = id;
}
ts
<ion-label text-wrap>
<h2 class="title">Friend</h2>
<p class="status"> Status</p>
</ion-label>
<ion-buttons>
<ion-button size="large" (click)="removeFriend(i)" (click)="onAdd(i)" slot="icon-only">
<ion-icon [color]="(addedIndex === i) ? 'primary' : 'light'" [name]="(addedIndex === i) ? 'add-circle-outline' : 'checkmark-circle-outline'"></ion-icon>
</ion-button>
</ion-buttons>
</ion-item>
</ion-list>
Belle approche! Mais, en utilisant cela, vous êtes limité à un seul ami supplémentaire, non?
@ AndreiGătej oui, je l'ai mentionné dans ma réponse et son exigence est également la même.