En aquest tema, aprendrem com els components d'Angular poden comunicar-se entre ells. La interacció de components és una part fonamental del desenvolupament d'aplicacions Angular, ja que permet que els components comparteixin dades i es coordinin per oferir una experiència d'usuari coherent.
Objectius
- Comprendre els diferents mètodes d'interacció entre components.
- Aprendre a passar dades de pares a fills i de fills a pares.
- Utilitzar serveis per a la comunicació entre components no relacionats.
Mètodes d'interacció entre components
- Passar dades de pares a fills
Per passar dades d'un component pare a un component fill, utilitzem propietats d'entrada (@Input). Aquestes propietats permeten que el component fill rebi dades del component pare.
Exemple
Component Pare (parent.component.ts):
import { Component } from '@angular/core';
@Component({
selector: 'app-parent',
template: `
<h1>Component Pare</h1>
<app-child [childMessage]="parentMessage"></app-child>
`
})
export class ParentComponent {
parentMessage = "Hola des del component pare!";
}Component Fill (child.component.ts):
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<h2>Component Fill</h2>
<p>{{ childMessage }}</p>
`
})
export class ChildComponent {
@Input() childMessage: string;
}En aquest exemple, el component pare (ParentComponent) passa la variable parentMessage al component fill (ChildComponent) mitjançant la propietat d'entrada childMessage.
- Passar dades de fills a pares
Per passar dades d'un component fill a un component pare, utilitzem esdeveniments de sortida (@Output) i l'objecte EventEmitter.
Exemple
Component Pare (parent.component.ts):
import { Component } from '@angular/core';
@Component({
selector: 'app-parent',
template: `
<h1>Component Pare</h1>
<app-child (messageEvent)="receiveMessage($event)"></app-child>
<p>Missatge del fill: {{ message }}</p>
`
})
export class ParentComponent {
message: string;
receiveMessage($event) {
this.message = $event;
}
}Component Fill (child.component.ts):
import { Component, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-child',
template: `
<h2>Component Fill</h2>
<button (click)="sendMessage()">Enviar Missatge</button>
`
})
export class ChildComponent {
@Output() messageEvent = new EventEmitter<string>();
sendMessage() {
this.messageEvent.emit('Hola des del component fill!');
}
}En aquest exemple, el component fill (ChildComponent) emet un esdeveniment amb un missatge quan es fa clic al botó. El component pare (ParentComponent) escolta aquest esdeveniment i actualitza la seva propietat message amb el valor rebut.
- Comunicació entre components no relacionats
Per comunicar-se entre components que no tenen una relació pare-fill, utilitzem serveis. Els serveis permeten compartir dades i funcionalitats entre components de manera eficient.
Exemple
Servei (message.service.ts):
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class MessageService {
private messageSource = new Subject<string>();
currentMessage = this.messageSource.asObservable();
changeMessage(message: string) {
this.messageSource.next(message);
}
}Component A (component-a.component.ts):
import { Component } from '@angular/core';
import { MessageService } from './message.service';
@Component({
selector: 'app-component-a',
template: `
<h1>Component A</h1>
<button (click)="newMessage()">Enviar Missatge</button>
`
})
export class ComponentA {
constructor(private messageService: MessageService) {}
newMessage() {
this.messageService.changeMessage('Hola des del Component A!');
}
}Component B (component-b.component.ts):
import { Component, OnInit } from '@angular/core';
import { MessageService } from './message.service';
@Component({
selector: 'app-component-b',
template: `
<h1>Component B</h1>
<p>{{ message }}</p>
`
})
export class ComponentB implements OnInit {
message: string;
constructor(private messageService: MessageService) {}
ngOnInit() {
this.messageService.currentMessage.subscribe(message => this.message = message);
}
}En aquest exemple, el MessageService s'utilitza per compartir un missatge entre ComponentA i ComponentB. Quan ComponentA canvia el missatge, ComponentB rep la nova informació.
Exercicis pràctics
Exercici 1: Passar dades de pares a fills
- Crea un component pare i un component fill.
- Passa una cadena de text del component pare al component fill utilitzant
@Input. - Mostra la cadena de text al component fill.
Exercici 2: Passar dades de fills a pares
- Crea un component pare i un component fill.
- Emmet un esdeveniment des del component fill amb un missatge utilitzant
@OutputiEventEmitter. - Captura l'esdeveniment al component pare i mostra el missatge rebut.
Exercici 3: Comunicació entre components no relacionats
- Crea dos components no relacionats (per exemple,
ComponentAiComponentB). - Crea un servei que permeti compartir un missatge entre aquests components.
- Canvia el missatge des de
ComponentAi mostra el missatge actualitzat aComponentB.
Resum
En aquesta secció, hem après com els components d'Angular poden comunicar-se entre ells utilitzant propietats d'entrada (@Input), esdeveniments de sortida (@Output), i serveis. Aquests mètodes ens permeten construir aplicacions Angular modulars i ben organitzades, on els components poden compartir dades i funcionalitats de manera eficient.
Curs d'Angular
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- Arquitectura d'Angular
- Primera aplicació Angular
Mòdul 2: Components d'Angular
- Comprendre els components
- Crear components
- Plantilles de components
- Estils de components
- Interacció de components
Mòdul 3: Enllaç de dades i directives
- Interpolació i enllaç de propietats
- Enllaç d'esdeveniments
- Enllaç de dades bidireccional
- Directives integrades
- Directives personalitzades
Mòdul 4: Serveis i injecció de dependències
Mòdul 5: Enrutament i navegació
Mòdul 6: Formularis a Angular
Mòdul 7: Client HTTP i observables
- Introducció al client HTTP
- Fer sol·licituds HTTP
- Gestionar respostes HTTP
- Utilitzar observables
- Gestió d'errors
Mòdul 8: Gestió d'estat
- Introducció a la gestió d'estat
- Utilitzar serveis per a la gestió d'estat
- NgRx Store
- NgRx Effects
- NgRx Entity
Mòdul 9: Proves a Angular
- Proves unitàries
- Proves de components
- Proves de serveis
- Proves de cap a cap
- Simulació de dependències
Mòdul 10: Conceptes avançats d'Angular
- Angular Universal
- Optimització del rendiment
- Internacionalització (i18n)
- Tubs personalitzats
- Animacions d'Angular
