Reputation: 138
Hi guys I can't understand why when i click on a card lo load some content it than loads it on every cards see image here: https://i.sstatic.net/RFvBA.jpg I?m pretty newbi on angular and do the most by coping paste from the hero tour on the angular website. Data are fetched from my database my child html
<div *ngIf="personaggio">
<h2> {{ personaggio.nome | uppercase }} Suoni:</h2>
<div>
<div *ngFor="let suono of suoni">
<div *ngIf="suono.fk_to_personaggi === personaggio.idpersonaggi">
{{suono.titolo}}
</div>
</div>
</div>
my child ts
import { Component, OnInit,Input } from '@angular/core';
import { Suono } from '../class/suono';
import { Personaggio } from '../class/personaggio';
import { MyService } from '../services/my.service';
@Component({
selector: 'app-suoni',
templateUrl: './suoni.component.html',
styleUrls: ['./suoni.component.css']
})
export class SuoniComponent implements OnInit {
@Input() personaggio: Personaggio;
suoni: Suono[];
constructor(private mySevice: MyService) { }
ngOnInit() {
this.getSuoni();
}
getSuoni(): void {
console.log("called getSuoni()");
this.mySevice.getSuoni()
.subscribe(suoni => this.suoni = suoni);
}
}
my parent html
<mat-card class="card" *ngFor="let personaggio of personaggi" (click)="onSelect(personaggio)" >
<mat-card-header>
<div mat-card-avatar class="card-header"></div>
<img mat-card-avatar src={{personaggio.immagine}}>
<mat-card-title>{{personaggio.nome}}</mat-card-title>
<mat-card-subtitle>{{personaggio.youtube_link}}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<app-suoni [personaggio]="selectedPersonaggio"></app-suoni>
</mat-card-content>
</mat-card>
my parent ts
import { Component, OnInit } from '@angular/core';
import { Personaggio } from '../class/personaggio';
import { MyService } from '../services/my.service';
@Component({
selector: 'app-personaggi',
templateUrl: './personaggi.component.html',
styleUrls: ['./personaggi.component.css']
})
export class PersonaggiComponent implements OnInit {
personaggi: Personaggio[];
selectedPersonaggio: Personaggio;
constructor(private mySevice: MyService) { }
ngOnInit() {
this.getPersonaggi();
}
getPersonaggi(): void {
this.mySevice.getPersonaggi()
.subscribe(personaggi => this.personaggi = personaggi);
}
onSelect(personaggio: Personaggio): void {
console.log("called onSelect()");
this.selectedPersonaggio = personaggio;
}
}
Upvotes: 1
Views: 3217
Reputation: 1106
You should only display mat-card-content
inside mat-card
which displays information about selected 'personaggio'. You can use ngIf directive for that.
<mat-card class="card" *ngFor="let personaggio of personaggi" (click)="onSelect(personaggio)" >
<mat-card-header>
<div mat-card-avatar class="card-header"></div>
<img mat-card-avatar src={{personaggio.immagine}}>
<mat-card-title>{{personaggio.nome}}</mat-card-title>
<mat-card-subtitle>{{personaggio.youtube_link}}</mat-card-subtitle>
</mat-card-header>
<mat-card-content *ngIf="personaggio === selectedPersonaggio">
<app-suoni [personaggio]="selectedPersonaggio"></app-suoni>
</mat-card-content>
</mat-card>
Upvotes: 1