@Input() properties, property binding, interpolation og pipes.
Checkout tag module-3-start. Du har en @for loop der renderer 6 HerdCard components, men de viser alle det samme hardcoded indhold (Malkekøer).
git checkout module-3-start
Åbn herd-card.ts og tilføj inputs for de data kortet skal vise:
// herd-card.ts
import { Component, Input } from '@angular/core';
@Component({
selector: 'app-herd-card',
imports: [],
templateUrl: './herd-card.html',
styleUrl: './herd-card.css',
})
export class HerdCard {
@Input() label = '';
@Input() emoji = '';
@Input() factor = 0;
@Input() count = 0;
}
I herd-input.html, send data fra @for loopen ned til hvert kort:
@for(herd of herdCards; track herd.key) {
<app-herd-card
[label]="herd.label"
[emoji]="herd.emoji"
[factor]="herd.factor"
/>
}
[label]="herd.label" er property binding. Firkantede parenteser binder en JavaScript expression til en @Input() property.
Erstat de hardcoded værdier med {{ }} interpolation:
<!-- herd-card.html -->
<div class="card">
<div class="card-top">
<span class="emoji">{{ emoji }}</span>
<div class="factor">
<span>CO2e/år</span>
<span>{{ factor | number }} kg</span>
</div>
</div>
<h3>{{ label }}</h3>
<div class="input-wrap">
<input type="number" min="0" placeholder="0"
(input)="onInput($event)" />
<span class="suffix">stk.</span>
</div>
</div>
{{ factor | number }} bruger Angulars built-in number pipe til at formatere tal med tusindtalsseparator. For at bruge den skal du importere DecimalPipe:
import { DecimalPipe } from '@angular/common';
@Component({
...
imports: [DecimalPipe],
})
(input) er event binding. Runde parenteser lytter på DOM events. Tilføj en simpel handler i herd-card.ts:
onInput(event: Event) {
const value = (event.target as HTMLInputElement).valueAsNumber || 0;
console.log(`${this.label}: ${value}`);
}
[property]="expression" → data ind (property binding)(event)="handler()" → data ud (event binding){{ expression }} → vis data (interpolation)
import { Component, Input } from '@angular/core';
import { DecimalPipe } from '@angular/common';
@Component({
selector: 'app-herd-card',
imports: [DecimalPipe],
templateUrl: './herd-card.html',
styleUrl: './herd-card.css',
})
export class HerdCard {
@Input() label = '';
@Input() emoji = '';
@Input() factor = 0;
@Input() count = 0;
onInput(event: Event) {
const value = (event.target as HTMLInputElement).valueAsNumber || 0;
console.log(`${this.label}: ${value}`);
}
}