2017-07-28 1 views
0

je le code HTML suivant dans mon principal composant:Valeurs de retour à partir de composants en boucle ngFor

<app-loc-list-item *ngFor="let loc of locs; let i = index" [loc]="loc" [i]="i"></app-loc-list-item> 

Le LocListItemComponent ressemble à ceci:

import { Component, OnInit, Input } from '@angular/core'; 

.... 

export class LocListItemComponent implements OnInit { 
    @Input() loc: Location; 
    @Input('i') index: number; 
    selected: boolean = false; 

    onLocationSelect() { 
    this.selected = !this.selected; 
    } 
} 

Maintenant, il peut y avoir un certain nombre de ces petits composants et entre 0 et n peuvent avoir la valeur selected = true. Je veux maintenant recevoir les valeurs index pour chacun de ces composants qui ont selected = true.

Comment puis-je accéder à ces valeurs d'index?

+0

Changez-vous l'élément sélectionné de LocListItemComponent? –

+0

Bon point, je l'ai effectivement, édité dans la fonction pour le faire. C'est un simple écouteur de clic. – Spurious

Répondre

3

si vous voulez seulement interroger l' « app-loc-list-item » enfants du composant parent comprennent alors cette ligne de code dans le parent

@ViewChildren(LocListItem) listItems: QueryList<LocListItem> 

afin que vous puissiez itérer sur la propriété listItems dans votre parent et voir ceux qui ont été sélectionnés

+0

Cela semble intéressant. Je vais essayer et voir si c'est tout ce que j'ai besoin de mettre en œuvre. – Spurious

+0

Ceci est une excellente réponse. J'aime comme c'est simple. Une chose à ajouter est que j'ai aussi besoin d'importer le composant. – Spurious

1

Pour que vous pouvez utiliser

@Output: utilisé pour transmettre des données de composant enfant à composant parent

Parent Composant:

<app-loc-list-item *ngFor="let loc of locs; let i = index" [loc]="loc" [i]="i" (change)="selectChange($event)"></app-loc-list-item> 

selectChange(data) 
{ 
    console.log(data); 
} 

Composante enfants:

export class LocListItemComponent implements OnInit { 
    @Input() loc: Location; 
    @Input('i') index: number; 
    @Output()change: EventEmitter<any> = new EventEmitter<any>(); 
    selected: boolean = false; 

    onLocationSelect() { 
    this.selected = !this.selected; 
    let data = { 'index' : this.index , 'selected' : this.selected } 
    this.change.emit(data); 
    } 
} 
+0

Cette réponse fonctionne aussi, donc je l'ai upvoted mais la réponse de Dean est beaucoup plus courte et nécessite moins de code surtout sur les enfants. Merci pour votre aide et j'ai testé le vôtre et fonctionne comme un charme. – Spurious

+0

@Spurious, pas de problème, heureux que vous avez trouvé 2 solutions et moi aussi. :) –

0

Il n'y a pas de double liaison de données entre les composants dans Angular (qui était dans AngularJs).

Il y a quelques façons pour votre problème, d'une façon est la suivante:

  • à utiliser un service où vous définissez locs et dans votre composant enfant

vous:

this.yourServices.locs.splice(index, 1) 

Edit: Ce que j'ai dit n'est pas correct. Ce sera le cas entre le composant non corrélé.

+0

Je me sens comme un «service» est une exagération. Je ne veux pas créer un 'service' juste pour un tableau à usage unique. – Spurious