<div *ngIf="search.length > 1">
</div>
search: string = "";
<div *ngIf="person">
{{person.firstName}}
</div>
Wichtig: Es ist ein grosser Unterschied ob ein Element mit CSS versteckt wird,
oder mit *ngIf aus dem DOM entfernt wird. Beim Verstecken bleibt das Element
im DOM und benötigt sowohl Speicher als auch weitere Resourcen. *ngIf ist
meist die bessere Lösung.
<input type="radio" name="mode"
[(ngModel)]="mode" value="simple">Einfach
<input type="radio" name="mode"
[(ngModel)]="mode" value="extended">Erweitert
<div *ngIf="mode === 'extended'">
<input type="text" [value]="extendedValue"
(input)="extendedValue=$event.target.value">
<p *ngIf="extendedValue.length >= 2">
Wert: {{extendedValue}}
</p>
</div>
val: string = "";
setting: string = "Einfach";
<div *ngIf="search.length > 1">
</div>
<template [ngIf]="search.length > 1">
</template>
<li *ngFor="let customer of customers">
{{ customer.name}}
</li>
<div *ngFor="let item of items; let idx = index;">
</div>
<div *ngFor="let todo of todos">
<h2>{{todo.title}}</h2>
<p>{{todo.desc}}</p>
</div>
todos: any[]= [{
title: "*ngFor",
desc: "Lösung finden"
}, {
title: "*ngSwitch",
desc: "Folien erstellen"
}];
Helper boolean Variablen für odd, even, first und last und die Index-Variable index
<div *ngFor="let todo of todos; let idx = index;
let first = first; let last = last;
let even = even; let odd = odd;">
{{idx}} // 0
{{first}} // true
{{last}} // true
{{even}} // true
{{odd}} // false
</div>
Object Identity wird für Änderungen an der Liste genutzt um die Anpassungen im DOM verfügbar zu machen. Mit einer eigenen trackBy Funktion kann dies gesteuert werden. Default ist object identity ===
<div *ngFor="let todo of todos; trackBy: myTrackFunc">
</div>
myTrackFunc(index, todo) {
return todo.id;
}
<div *ngFor="let item of items; let idx = index;">
</div>
<template ngFor let--item let-idx="index"
[ngForOf]="items">
<div>
</div>
</template>
<div [ngSwitch]="selectedFruit">
<apple-view *ngSwitchCase="Fruit.APPLE">
</apple-view>
<orange-view *ngSwitchCase="Fruit.ORANGE">
</orange-view>
<no-fruit-selected *ngSwitchDefault>
</no-fruit-selected>
</div>
für einzelne Klassen - ein Class Binding benutzen
für mehrere Klassen - die ngClass Directive
<div [ngClass]="{
'active': customer.active,
'inactive': !customer.active}">
</div>
für einzelne Styles ein Style Binding benutzen
<span
[style.font-weight]="pers.isVip ? 'bold' : 'normal'">
</span>
für mehrere Styles die ngStyle Directive
<span [ngStyle]="{
'font-size': pers.isVip ? 'bold' : 'normal'
'color': pers.isVip ? 'red' : 'blue'}">
</span>
{{birthday | date:'MM/dd/yy'}}
{{customer | json}}
{{kontostand | currency:'CHF':false}}
{{titel | lowercase | uppercase}}
{{rechnungsNr | invoiceNr}}
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'ellipsis'})
export class EllipsisPipe implements PipeTransform {
transform(word: string, count: number): string {
if(!count) {
return word;
}
if(word.length <= count) {
return word
}
return word.substring(0, count) + '...';
}
}
{{'Lorem ipsum dolor' | ellipsis:10}}
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({name: 'phonenumber'})
export class PhoneNumberPipe implements PipeTransform {
transform(phoneNumber: string, countryCode: string): string {
let parts = phoneNumber.match(/^(\d{3})(\d{3})(\d{2})(\d{2})$/);
if (!parts) return phoneNumber;
let formatted = `${parts[1]} ${parts[2]} ${parts[3]} ${parts[4]}`;
if (countryCode) {
formatted = `+${countryCode} ${formatted.substring(1)}`;
}
return formatted;
}
}
Name: {{comp?.ceo?.name}}
Name: {{comp && comp.ceo && comp.ceo.name}}