In den letzten Tagen haben wir viel über angular
gelernt. Dieses Mal werden wir uns ein kleines Produkt einfallen lassen.
angualr
wird mit ng-zorro
kombiniert, um schnell und standardisiert ein Backend-System zu entwickeln. [Verwandte Tutorial-Empfehlung: „Angular Tutorial“]
Zu den Systemfunktionen gehören die folgenden:
aller Dienste, Verwendung simulierter Daten.
Lass es uns tun.
Zu den beliebtesten ui
angular
in Kombination mit NG-Zorro
Angular gehören:glaube Ant Design
, diejenigen, die Front-End-Entwicklung betreiben sind damit vertraut. Hier kombinieren wir es mit dem NG-ZORRO
-Framework. Wenn Sie mit Vue
oder React
Version von Ant Design
vertraut sind, können Sie meiner Meinung nach eine nahtlose Verbindung herstellen ~
Wir verwenden angular-cli
erneut, um ein Projekt ng-zorro
zu generieren.
Das Hinzufügen von ng-zorro
ist sehr einfach: Geben Sie ng-zorro
ein und führen Sie ng add ng-zorro-antd
aus.
Natürlich können Sie zum Hinzufügen auch
npm install ng-zorro-antd
ausführen, dies wird jedoch nicht empfohlen.
Nach der Kombination von ng-zorro
führen wir das Projekt npm run start
aus und Sie sehen das folgende Bild auf der Seite http://localhost:4200
.
Nicht schlecht, Bruder.
Wir habendas Konfigurationsrouting
auf hash
-Routing umgestellt und das Gerüst hinzugefügt. Wir müssen nur ein paar kleinere Änderungen vornehmen.
Idee:
Fügen Sie zuerst die Seite mit user
hinzu, verwenden Sie table
in ng-zorro
um die Seite des Benutzers hinzuzufügen und zu ändern, um dieselbe Seite freizugeben, und verwenden form
ng-zorro
Funktion zum Löschen von Formularkomponentenseiten in ng-zorro, um die Popup-Eingabeaufforderung direkt zu verwenden , verwenden ng-zorro
führt ng-zorro
Komponente nach Bedarf ein, um
die Routing-Datei anzupassen.
Gemäß der Idee müssen wir sie in ng-zorro
einführen:
// app.module.ts import { ReactiveFormsModule } aus '@angular/forms'; import { NzTableModule } from 'ng-zorro-antd/table'; import { NzModalModule } from 'ng-zorro-antd/modal'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzFormModule } from 'ng-zorro-antd/form'; import { NzInputModule } from 'ng-zorro-antd/input'; // ... imports: [ // Fügen Sie es in Imports hinzu, anstatt NzTableModule in Deklarationen zu deklarieren. NzModalModule, NzButtonModule, NzFormModule, ReactiveFormsModule, NzInputModule ],
einfaches und leicht verständliches Prinzip, wir verwenden keine children
zum Verschachteln von Routing:
// app.routing.module.ts import { NgModule } from '@angular/core'; import { Routes, RouterModule, PreloadAllModules } from '@angular/router'; import { WelcomeComponent } from './pages/welcome/welcome.component'; import { UserComponent } aus './pages/user/user.component'; import { UserInfoComponent } aus './pages/user/user-info/user-info.component'; //Verwandte Routen const Routen: Routes = [ { Weg: '', pathMatch: 'full', RedirectTo: '/welcome' }, { Pfad: 'Willkommen', Komponente: WelcomeComponent }, { Pfad: 'Benutzer', Komponente: UserComponent }, { Pfad: 'Benutzer/Hinzufügen', Komponente: UserInfoComponent }, { Pfad: 'user/edit/:uuid', Komponente: UserInfoComponent } ]; @NgModule({ Importe: [RouterModule.forRoot( Routen, { useHash: true, // Hash-Modus verwenden preloadingStrategy: PreloadAllModules } )], Exporte: [RouterModule] }) export class AppRoutingModule { }
Menü ändern
Das mit Scaffolding generierte Menü entspricht nicht den Funktionen, die wir entwickeln müssen.
// app.component.html <nz-layout class="app-layout"> <nz-sider class="menu-sidebar" nzZusammenklappbar nzWidth="256px" nzBreakpoint="md" [(nzCollapsed)]="isCollapsed" [nzTrigger]="null"> <div class="sidebar-logo"> <!-- Klicken Sie standardmäßig auf das Logo, um zur Startseite zu springen --> <a routerLink="/welcome"> <img src="https://ng.ant.design/assets/img/logo.svg" alt="logo"> <h1>Ng-Zorro</h1> </a> </div> <ul nz-menu nzTheme="dark" nzMode="inline" [nzInlineCollapsed]="isCollapsed"> <li nz-submenu nzOpen nzTitle="Benutzerverwaltung" nzIcon="dashboard"> <ul> <li nz-menu-item nzMatchRouter> <a routerLink="/user">Benutzerliste</a> </li> </ul> </li> </ul> </nz-sider> <nz-layout> <nz-header> <div class="app-header"> <span class="header-trigger" (click)="isCollapsed = !isCollapsed"> <i class="trigger" NZ-Symbol [nzType]="isCollapsed ? 'menu-unfold': 'menu-fold'" ></i> </span> </div> </nz-header> <nz-content> <div class="inner-content"> <router-outlet></router-outlet> </div> </nz-content> </nz-layout> </nz-layout>
Menüanzeige: Wenn wir eine Berechtigungsverwaltung durchführen müssen, müssen wir das Backend bei der Wertübertragung unterstützen. Anschließend rendern wir das entsprechende Berechtigungsmenü auf der Seite
und ersetzen es durch den oben genannten Grundcode ist wie folgt:
Vervollständigen Sie die Benutzerliste.
Vervollständigen Sie als Nächstes das Grundgerüst der Benutzerliste. Da wir das UI
Framework verwenden, ist es für uns äußerst praktisch, Folgendes zu schreiben:
Holen Sie sich die Benutzerliste
// user.component.html <nz-table #basicTable [nzData]="list"> <thead> <tr> <th>Name</th> <th>Position</th> <th>Aktion</th> </tr> </thead> <tbody> <!-- Durchlaufen Sie die erhaltenen Daten --> <tr *ngFor="let data of basicTable.data"> <td>{{data.name}}</td> <td>{{data.position}}</td> <td> <a style="color: #f00;">Löschen</a> </td> </tr> </tbody> </nz-table>
Wir haben einige Daten im assets
-Ordner user.json
simuliert:
{ „Benutzer“: [ { "uuid": 1, „Name“: „Jimmy“, „position“: „Frontend“ }, { "uuid": 2, „Name“: „Jim“, „position“: „Backend“ } ], „Umwelt“: „Entwicklung“ }
Nachdem wir den Dienst geschrieben haben, rufen wir auf, um die Daten des Benutzers abzurufen:
// user.component.ts import { Component, OnInit } from '@angular/core'; import { UserService } aus 'src/app/services/user.service'; @Komponente({ Selektor: 'App-Benutzer', templateUrl: './user.component.html', styleUrls: ['./user.component.scss'] }) Die Exportklasse UserComponent implementiert OnInit { öffentliche Liste: any = [] Konstruktor( privater schreibgeschützter userService: UserService ) { } ngOnInit(): void { if(localStorage.getItem('users')) { let obj = localStorage.getItem('users') ||. this.list = JSON.parse(obj) } anders { this.getList() } } // Holen Sie sich die Benutzerliste getList() { this.userService.getUserList().subscribe({ weiter: (Daten: beliebig) => { localStorage.setItem('users', JSON.stringify(data.users)) this.list = data.users }, Fehler: (Fehler: beliebig) => { console.log(Fehler) } }) } }
Da kein Back-End-Dienst eingeführt wird, verwenden wir hier localstorage
um den Status aufzuzeichnen.
Nachdem wir die oben genannten Schritte ausgeführt haben, erhalten wir die Listeninformationen wie folgt:
Um Benutzer hinzuzufügen und Benutzer zu bearbeiten,
erstellen wir einfach ein Formular, das nur zwei Felder enthält, nämlich name
und position
. Diese beiden Funktionen teilen sich ein Formular ~
wir fügen es in html
ein:
// user-info.component.html <form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()"> <nz-form-item> <nz-form-control nzErrorTip="Bitte Benutzernamen eingeben!"> <input type="text" nz-input formControlName="username" placeholder="Please enter username" style="width: 160px;" /> </nz-form-control> </nz-form-item> <nz-form-item> <nz-form-control nzErrorTip="Bitte geben Sie eine Position ein!"> <input type="text" nz-input formControlName="position" placeholder="Bitte geben Sie die Position ein" style="width: 160px;"/> </nz-form-control> </nz-form-item> <button nz-button class="login-form-button login-form-margin" [nzType]="'primary'">Bestätigen</button> </form>
Die Seite sieht so aus:
Dann gibt es die logische Entscheidung, etwas hinzuzufügen oder zu ändern. Wenn die Verbindung mit uuid
gekennzeichnet ist, bedeutet dies, dass sie bearbeitet wird. show you the codes
.
// user-info.component.ts import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, ParamMap } from '@angular/router'; @Komponente({ Selektor: 'App-Benutzerinfo', templateUrl: './user-info.component.html', styleUrls: ['./user-info.component.scss'] }) Die Exportklasse UserInfoComponent implementiert OnInit { public isAdd: boolean = true; öffentliche Benutzerinfo: any = [] öffentliche UUID: Zahl = 0; validierenForm!: FormGroup; Konstruktor( private fb: FormBuilder, private Route: ActivatedRoute, ) { } ngOnInit(): void { this.userInfo = JSON.parse(localStorage.getItem('users') || '[]') this.route.paramMap.subscribe((params: ParamMap)=>{ this.uuid = parseInt(params.get('uuid') || '0') }) // Es ist der Bearbeitungsstatus, setze die Kennung if(this.uuid) { this.isAdd = false } if(this.isAdd) { this.validateForm = this.fb.group({ Benutzername: [null, [Validators.required]], Position: [null, [Validators.required]] }); } anders { let current = (this.userInfo.filter((item: any) => item.uuid === this.uuid))[0] || {} // Informations-Backfill this.validateForm = this.fb.group({ Benutzername: [aktueller.Name, [Validatoren.erforderlich]], Position: [aktuelle.Position, [Validatoren.erforderlich]] }) } } sendForm() { // Wenn es der Übermittlung nicht entspricht, wird ein Fehler gemeldet if(!this.validateForm.valid) { Object.values(this.validateForm.controls).forEach((control: any) => { if(control?.invalid) { control?.markAsDirty(); control?.updateValueAndValidity({ onlySelf: true }); } }) zurückkehren } // Formulardaten abrufen const data = this.validateForm.value //Neuen Benutzer hinzufügen if(this.isAdd) { let lastOne = (this.userInfo.length > 0 ? this.userInfo[this.userInfo.length-1] : {}); this.userInfo.push({ uuid: (lastOne.uuid ? (lastOne.uuid + 1) : 1), Name: data.username, Position: data.position }) localStorage.setItem('users', JSON.stringify(this.userInfo)) } else { //Benutzer bearbeiten, Informationen aktualisieren let mapList = this.userInfo.map((item: any) => { if(item.uuid === this.uuid) { zurückkehren { uuid: this.uuid, Name: data.username, Position: data.position } } Artikel zurücksenden }) localStorage.setItem('users', JSON.stringify(mapList)) } } }
Wir setzen zunächst einen Bezeichner isAdd
, der standardmäßig einen neuen Benutzer verwendet. Wenn uuid
vorhanden ist, setzen wir sie auf einen false
Wert, um anzuzeigen, dass sie sich in einem Bearbeitungsstatus befindet, und füllen das Formular mit dem Inhalt auf. Der Vorgang des Absendens eines Formulars wird ebenfalls anhand dieser Kennung beurteilt. Wir ändern die localStorage
-Informationen direkt, um die Synchronisierung der Listeninformationen sicherzustellen.
Für die Löschfunktion
führen wir ein modales Dialogfeld ein, in dem Sie gefragt werden, ob gelöscht werden soll.
// user.component.ts // Löschen delete(data: any) { this.modal.confirm({ nzTitle: '<i>Möchten Sie diesen Benutzer löschen?</i>', nzOnOk: () => { letuser = JSON.parse(localStorage.getItem('users') || '[]'); let filterList = users.filter((item: any) => item.uuid !== data.uuid); localStorage.setItem('users', JSON.stringify(filterList)); this.list = filterList } }); }
Wir finden die gelöschten Daten, entfernen sie, speichern die neuen Benutzerdaten erneut zwischen und aktualisieren table
.
Bisher haben wir ein einfaches Projekt erfolgreich abgeschlossen. Schauen wir uns das Ganze anhand Gif
an.
【über】