Beispiel Ordnerstruktur¶
- test_app
- node_modules
- public
- src
- app
- bike-list
- bike-list.component.ts
- bike-list.component.html
- bike-list.component.css
- renter-form
- renter-form.component.ts
- renter-form.component.html
- renter-form.component.css
- shared
- bike.model.ts
- renter.model.ts
- app.component.ts
- app.component.html
- app.component.css
- app.routes.ts
- main.ts
- index.html
- styles.css
Schritte und Umsetzung¶
1. Projektinitialisierung¶
-
Terminal-Befehle:
-
Bootstrap in
angular.jsoneinbinden: Datei:angular.json
2. Komponenten erstellen¶
-
Komponente für Fahrräder-Liste:
-
Komponente für das Mieter-Formular:
3. Datenmodell erstellen¶
-
Fahrradmodell: Datei:
src/app/shared/bike.model.ts -
Mietermodell: Datei:
src/app/shared/renter.model.ts
4. Fahrräder-Liste anzeigen¶
-
Daten hinzufügen: Datei:
bike-list.component.tsimport { Component } from '@angular/core'; import { Bike } from '../shared/bike.model'; @Component({ selector: 'app-bike-list', templateUrl: './bike-list.component.html', styleUrls: ['./bike-list.component.css'] }) export class BikeListComponent { bikes: Bike[] = [ { id: 1, name: 'E-Bike 1', available: true }, { id: 2, name: 'E-Bike 2', available: false }, { id: 3, name: 'E-Bike 3', available: true } ]; } -
HTML-Ansicht: Datei:
bike-list.component.html
5. Formular für Mieter mit Validierung¶
-
Formular in
renter-form.component.html:<form (ngSubmit)="onSubmit()" #renterForm="ngForm"> <div class="mb-3"> <label for="name" class="form-label">Name</label> <input type="text" id="name" class="form-control" required ngModel name="name"> </div> <div class="mb-3"> <label for="email" class="form-label">E-Mail</label> <input type="email" id="email" class="form-control" required ngModel name="email"> </div> <div class="mb-3"> <label for="phone" class="form-label">Telefonnummer</label> <input type="text" id="phone" class="form-control" required ngModel name="phone"> </div> <button type="submit" class="btn btn-primary" [disabled]="!renterForm.valid">Absenden</button> </form> -
Logik in
renter-form.component.ts:import { Component } from '@angular/core'; import { NgForm } from '@angular/forms'; @Component({ selector: 'app-renter-form', templateUrl: './renter-form.component.html', styleUrls: ['./renter-form.component.css'] }) export class RenterFormComponent { onSubmit(form: NgForm) { console.log('Mieter-Daten:', form.value); form.reset(); } }
6. Routing einrichten¶
-
Routes in
app.routes.ts:import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { BikeListComponent } from './bike-list/bike-list.component'; import { RenterFormComponent } from './renter-form/renter-form.component'; const routes: Routes = [ { path: 'bikes', component: BikeListComponent }, { path: 'rent', component: RenterFormComponent }, { path: '', redirectTo: '/bikes', pathMatch: 'full' } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule {} -
Routing in
app.component.html:<nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="#">Bike-Verleih</a> <div class="collapse navbar-collapse"> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a class="nav-link" routerLink="/bikes">Fahrräder</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/rent">Mieter</a> </li> </ul> </div> </div> </nav> <router-outlet></router-outlet>
7. Hauptdateien¶
main.tsundindex.htmlbleiben standardmäßig unverändert.styles.csskann für globale Stile erweitert werden.
2. Beispiel:¶
Schritt-für-Schritt-Anleitung: Entwicklung einer Bike-Verleih-Applikation in Angular¶
1. Projektinitialisierung¶
- Erstellen des Angular-Projekts: Öffne ein Terminal und führe folgende Befehle aus:
ng new: Erstellt ein neues Angular-Projekt.-
Der Name des Projekts lautet
bike-rental. -
Bootstrap integrieren (für Styling): Installiere Bootstrap:
Füge Bootstrap zur Dateiangular.jsonhinzu: - Datei:
angular.json -
Ändern:
-
Projektstruktur vorbereiten: Das Projekt wird in folgende Module aufgeteilt:
- Mieter-Management (Renter Form): Formular zur Eingabe von Mieterdaten.
- Verleihverwaltung (Bike List): Liste der verfügbaren Fahrräder.
2. Erstellen der Komponenten¶
Angular-Komponenten sind die Bausteine der Anwendung.
- Erstellen der
bike-list-Komponente: -
Erstellt eine Komponente, die die verfügbaren Fahrräder anzeigt.
-
Erstellen der
renter-form-Komponente: -
Erstellt eine Komponente für das Formular zur Aufnahme von Mieterdaten.
-
Erstellen eines Moduls für geteilte Modelle und Daten:
- Datei:
shared/bike.model.ts - Datei:
shared/renter.model.ts
3. Anzeige der verfügbaren Fahrräder¶
-
Logik in
bike-list.component.ts: Datei:src/app/bike-list/bike-list.component.tsimport { Component } from '@angular/core'; import { Bike } from '../shared/bike.model'; @Component({ selector: 'app-bike-list', templateUrl: './bike-list.component.html', styleUrls: ['./bike-list.component.css'] }) export class BikeListComponent { bikes: Bike[] = [ { id: 1, name: 'Mountain Bike', available: true }, { id: 2, name: 'City Bike', available: false }, { id: 3, name: 'E-Bike', available: true }, ]; } -
HTML-Ansicht in
bike-list.component.html: Datei:src/app/bike-list/bike-list.component.html<div class="container"> <h2>Fahrrad-Verleih</h2> <ul class="list-group"> <li class="list-group-item" *ngFor="let bike of bikes"> <strong>{{ bike.name }}</strong> - <span [ngClass]="bike.available ? 'text-success' : 'text-danger'"> {{ bike.available ? 'Verfügbar' : 'Nicht verfügbar' }} </span> </li> </ul> </div> -
CSS-Design in
bike-list.component.css: Datei:src/app/bike-list/bike-list.component.css
4. Formular für Mieter (mit Validierung)¶
-
Formular-HTML in
renter-form.component.html: Datei:src/app/renter-form/renter-form.component.html<form (ngSubmit)="onSubmit()" #renterForm="ngForm"> <div class="mb-3"> <label for="name" class="form-label">Name</label> <input type="text" id="name" class="form-control" required ngModel name="name"> </div> <div class="mb-3"> <label for="email" class="form-label">E-Mail</label> <input type="email" id="email" class="form-control" required ngModel name="email"> </div> <div class="mb-3"> <label for="phone" class="form-label">Telefonnummer</label> <input type="text" id="phone" class="form-control" required ngModel name="phone"> </div> <button type="submit" class="btn btn-primary" [disabled]="!renterForm.valid">Absenden</button> </form> -
Logik in
renter-form.component.ts: Datei:src/app/renter-form/renter-form.component.tsimport { Component } from '@angular/core'; import { NgForm } from '@angular/forms'; @Component({ selector: 'app-renter-form', templateUrl: './renter-form.component.html', styleUrls: ['./renter-form.component.css'] }) export class RenterFormComponent { onSubmit(form: NgForm) { console.log('Mieter-Daten:', form.value); form.reset(); } } -
CSS in
renter-form.component.css: Datei:src/app/renter-form/renter-form.component.css
5. Routing einrichten¶
-
Routen in
app.routes.ts: Datei:src/app/app.routes.tsimport { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { BikeListComponent } from './bike-list/bike-list.component'; import { RenterFormComponent } from './renter-form/renter-form.component'; const routes: Routes = [ { path: 'bikes', component: BikeListComponent }, { path: 'rent', component: RenterFormComponent }, { path: '', redirectTo: '/bikes', pathMatch: 'full' }, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule {} -
Navigation in
app.component.html: Datei:src/app/app.component.html<nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="#">Bike-Verleih</a> <ul class="navbar-nav me-auto"> <li class="nav-item"> <a class="nav-link" routerLink="/bikes">Fahrräder</a> </li> <li class="nav-item"> <a class="nav-link" routerLink="/rent">Mieter</a> </li> </ul> </div> </nav> <router-outlet></router-outlet>
Zusammenfassung¶
Das Projekt enthält: - Bike-Liste: Anzeige aller Fahrräder mit Verfügbarkeitsstatus. - Mieter-Formular: Aufnahme von Kontaktdaten mit Validierung. - Routing: Navigation zwischen den Seiten.
Falls gewünscht, könnte die nächste Stufe das Hinzufügen einer API sein, um Fahrraddaten dynamisch abzurufen.