navigation Navigation


Selectors


In Angular spielen Selectors eine zentrale Rolle, da sie die Brücke zwischen dem HTML-Template und der zugehörigen Komponente darstellen. Der Selector bestimmt, wie und wo Angular eine Komponente im DOM erkennen und rendern soll.

Grundlagen - Component Selectors

Definition und Zweck

Verbindung von Template und Komponente

Der Selector ist Teil des @Component Dekorators und teilt Angular mit, welches HTML-Element (oder welches Attribut oder Klasse) als Platzhalter für die Komponente dient.

Wenn Angular das in einem Template verwendete Element findet, weiß es, dass hier die entsprechende Komponente eingefügt/aufgebaut werden soll.

Identifikation im DOM

Mit Hilfe des Selectors wird beim Kompilieren der Anwendung festgelegt, welche Elemente durch die jeweilige Komponente ersetzt bzw. erweitert werden.

Typen von Selektoren

Angular unterstützt verschiedene Arten von Component Selectors.

Element-Selektor

Der Element-Selektor ist die häufigste und einfachste Form. Er wird verwendet, um Komponenten als eigenständige HTML-Elemente zu definieren. Element-Selektoren werden ohne spezielle Präfixe definiert.

Definition
@Component({
    selector: 'app-hero-list',
    template: `
        <h2>Helden</h2>
        <ul>
            <li *ngFor="let hero of heroes">
                {{ hero }}
            </li>
        </ul>
    `
})
export class HeroListComponent {
    heroes = ['Superman', 'Batman', 'Wonder woman'];
}
Verwendung
<app-hero-list></app-hero-list>

Element-Selektoren sind ideal für eigenständige Komponenten wie Navigationsleisten, Karten, Listen, Bereiche, Formulare oder vergleichbar geeignet. Sie werden als eigene HTML-Elemente in das Template eingebunden und sind damit klar als abgegrenzte UI-Komponenten erkennbar.


Attribut-Selektoren

Attribut-Selektoren werden verwendet, um Komponenten als Attribute an bestehenden HTML-Elementen anzuwenden. Sie werden in eckigen Klammern [] definiert.

Definition
@Component({
    selector: '[app-hero-detail]',
    template: `<p>{{ heroName }}</p>`
})
export class HeroListComponent {
    @Input() heroName: string = '';
}
Verwendung
<div app-hero-detail heroName="Batman"></div>

Attribut-Selektoren sind besonders nützlich, wenn man das Verhalten oder Aussehen eines existierenden HTML-Elements erweitern möchte, ohne dessen grundlegende Struktur zu verändern. Sie eignen sich gut für Direktiven oder kleinere Erweiterungen wie Tooltips, Validierungen oder spezielle Formatierungen.


Klassen-Selektoren

Klassen-Selektoren in Angular werden verwendet, um Komponenten als CSS-Klassen auf HTML-Elementen anzuwenden. Sie werden mit einem Punkt . definiert.

Definition
@Component({
    selector: '.app-warning-msg',
    template: `<p>Warnung: {{ msg }}</p>`
})
export class HeroListComponent {
    @Input() msg: string = 'Standardwarnung';
}
Verwendung
<div
    class="app-warning-msg"
    msg="Benutzerdefinierte Warnung"
></div>

Klassen-Selektoren sind weniger häufig als die anderen beiden Arten, können aber nützlich sein, wenn man mehrere Komponenten auf ein Element anwenden möchte oder wenn man die Komponente als Teil eines bestehenden CSS-Klassensystems integrieren möchte.


Kombination von Selektoren

Angular erlaubt auch die Kombination mehrerer Selektoren für eine einzelne Komponente. Dies kann durch Kommas getrennte Selektoren in der Komponentendefinition erreicht werden.

Definition
@Component({
    selector: 'app-hero-btn, [hero-btn], .hero-btn',
    template: `<button>{{ label }}</button>`
})
export class HeroBtnComponent {
    @Input() label: string = 'Held hinzufügen';
}
Verwendung: Als Element
<app-hero-btn label="Speichern"></app-hero-btn>
Verwendung: Als Attribut
<button hero-btn label="Bearbeiten"></button>
Verwendung: Als Klasse
<button class="hero-btn" label="Löschen"></button>

Selektoren mit Bedingungen

Fortgeschrittene Selektor-Muster ermöglichen es, Komponenten nur unter bestimmten Bedingungen anzuwenden. Hierbei werden CSS-ähnliche Selektor-Muster verwendet.

Elemente mit bestimmten Attributen

Definition
@Component({
    selector: 'button[hero-btn]',
    template: `<ng-content></ng-content>`
})
export class HeroBtnComponent {}

Diese Komponente wird nur auf Button-Elemente mit dem Attribut hero-btn angewendet.

Verwendung
<button hero-btn>Held speichern</button>

Elementen mit bestimmten Klassen

Definition
@Component({
    selector: 'div.alert',
    template: `<strong>Warnung:</strong> <ng-content></ng-content>`
})
export class AlertComponent {}

Diese Komponente wird nur auf div-Elemente mit der CSS-Klasse alert angewendet.

Verwendung
<div class="alert">Daten wurden geändert!</div>

Namenskonventionen für Selektoren

In Angular gibt es bewährte Praktiken für die Benennung von Selektoren.

1. Präfixe verwenden: Um Konflikte mit nativen HTML-Elementen und Drittanbieter-Komponenten zu vermeiden, sollten Angular-Komponenten-Selektoren ein Präfix bekommen. Standardmäßig verwendet das Angular CLI app- als Präfix, aber Projekte können ihr eigenes Präfix definieren.

2. Kebab-Case verwenden: Selektoren sollten im Kebab-Case-Format (mit Bindestrichen zwischen Wörtern) geschrieben werden, z.B. app-hero-detail statt appHeroDetail.

Beispiel: Präfix
@Component({
    selector: 'acme-product-list',
    template: `<div>Produktliste</div>`
})
export class ProductListComponent {}