<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}}