
За последние несколько дней статей мы многое узнали об angular . На этот раз мы представим небольшой продукт.
angualr сочетается с ng-zorro для быстрой и стандартизированной разработки серверной системы. [Рекомендация по соответствующему учебному пособию: «Учебное пособие по Angular»]
Системные функции включают в себя следующее:
всех служб, использование смоделированных данных.
Давай сделаем это.
К более популярным angular ui
в сочетании с ng-zorro
angular относятся:Ant Design считаю, что это те, кто занимается интерфейсной разработкой. знакомы с этим. Итак, здесь мы объединяем его с фреймворком NG-ZORRO . Если вы знакомы с версией Ant Design для Vue или React , я думаю, вы сможете легко подключиться ~

Мы повторно используем angular-cli для создания проекта ng-zorro .
Добавить ng-zorro очень просто: войдите ng-zorro и выполните ng add ng-zorro-antd .
Конечно, вы также можете выполнить
npm install ng-zorro-antd, чтобы добавить его, но это не рекомендуется.
После объединения ng-zorro запускаем проект npm run start , и на странице http://localhost:4200 вы увидите следующую картинку.

Неплохо, братан.
Мы изменилимаршрутизацию конфигурации
на hash -маршрутизацию и добавили маршрутизацию пользователей. Нам нужно лишь внести несколько незначительных изменений.
Идея:
сначала добавьте страницу списка user страницы, используйте компонент table в ng-zorro
, чтобы добавить и изменить страницу пользователя, чтобы поделиться той же страницей ng-zorro form
функцию удаления страницы компонента формы в ng-zorro, чтобы напрямую использовать всплывающую подсказку. , используйте ng-zorro
вводит компонент ng-zorro по мере необходимости для
корректировки файла маршрутизации.
По идее, мы должны ввести его в ng-zorro :
// app.module.ts.
импортировать {ReactiveFormsModule} из '@angular/forms';
импортировать { NzTableModule } из 'ng-zorro-antd/table';
импортировать { NzModalModule } из 'ng-zorro-antd/modal';
импортировать { NzButtonModule } из 'ng-zorro-antd/button';
импортировать { NzFormModule } из 'ng-zorro-antd/form';
импортировать { NzInputModule } из 'ng-zorro-antd/input';
// ...
imports: [ // Добавляем его в импорт вместо объявления NzTableModule в объявлениях,
НзМодалМодуль,
НзКнопкаМодуль,
НзФормМодуль,
РеактивныйФормМодуль,
НзИнпутМодуль
], простой и понятный принцип: мы не используем children для вложенной маршрутизации:
// app.routing.module.ts
импортировать { NgModule } из '@angular/core';
import {Routes, RouterModule, PreloadAllModules} from '@angular/router';
импортировать { WelcomeComponent } из './pages/welcome/welcome.comComponent';
импортировать { UserComponent } из './pages/user/user.comComponent';
импортировать { UserInfoComponent } из './pages/user/user-info/user-info.comComponent';
//Связанные маршруты const маршруты: Routes = [
{
путь: '',
pathMatch: 'полный',
redirectTo: '/добро пожаловать'
},
{
путь: «добро пожаловать»,
компонент: Добро пожаловатьКомпонент
},
{
путь: 'пользователь',
компонент: ПользовательскийКомпонент
},
{
путь: 'пользователь/добавить',
компонент: UserInfoComponent
},
{
путь: 'пользователь/редактировать/:uuid',
компонент: UserInfoComponent
}
];
@NgModule({
импорт: [RouterModule.forRoot(
маршруты,
{
useHash: true, //Использовать режим хеширования preloadingStrategy: PreloadAllModules
}
)],
экспорт: [RouterModule]
})
экспортный класс AppRoutingModule { } Изменить меню
Меню, созданное с помощью scaffolding, не соответствует функциям, которые нам нужно разработать. Давайте его настроим.
// приложение.компонент.html
<nz-layout class="app-layout">
<nz-sider class="меню-боковая панель"
nzСкладной
nzWidth="256 пикселей"
nzBreakpoint="мд"
[(nzCollapsed)]="Свернуто"
[nzTrigger]="нуль">
<div class="sidebar-logo">
<!-- По умолчанию нажмите на логотип, чтобы перейти на главную страницу -->
<a routerLink="/добро пожаловать">
<img src="https://ng.ant.design/assets/img/logo.svg" alt="logo">
<h1>Нг-Зорро</h1>
</а>
</div>
<ul nz-menu nzTheme="dark" nzMode="inline" [nzInlineCollapsed]="isCollapsed">
<li nz-submenu nzOpen nzTitle="Управление пользователями" nzIcon="dashboard">
<ул>
<li nz-menu-item nzMatchRouter>
<a routerLink="/user">Список пользователей</a>
</li>
</ul>
</li>
</ul>
</nz-сайд>
<nz-макет>
<nz-заголовок>
<div class="app-header">
<span class="header-trigger" (click)="isCollapsed = !isCollapsed">
<я класс="триггер"
nz-значок
[nzType]="isCollapsed ? 'меню-развернуть': 'меню-свернуть'"
></i>
</span>
</div>
</nz-header>
<nz-контент>
<div class="inner-content">
<роутер-выход></роутер-выход>
</div>
</nz-content>
</nz-макет>
</nz-layout> Отображение меню. Если нам нужно выполнить управление разрешениями, нам нужен бэкэнд, который будет сотрудничать с передачей значений. Затем мы отображаем соответствующее меню разрешений на странице
и заменяем его приведенным выше кодом. заключается в следующем:

Заполните список пользователей.
Затем заполните скелет списка пользователей. Поскольку мы используем инфраструктуру UI , нам очень удобно писать:
Получить список пользователей
// user.comComponent.html.
<nz-table #basicTable [nzData]="list">
<голова>
<тр>
<th>Имя</th>
<th>Позиция</th>
<th>Действие</th>
</tr>
</тхед>
<тело>
<!-- Обходим полученные данные -->
<tr *ngFor="освободить данные из BasicTable.data">
<td>{{data.name}}</td>
<td>{{data.position}}</td>
<тд>
<a style="color: #f00;">Удалить</a>
</td>
</tr>
</tbody>
</nz-table> Мы смоделировали некоторые данные в папке assets user.json :
{
"пользователи": [
{
"ууид": 1,
"name": "Джимми",
"position": "Фронтенд"
},
{
«ууид»: 2,
"имя": "Джим",
"position": "Бэкенд"
}
],
«окружающая среда»: «развитие»
} После написания сервиса мы вызываем его для получения данных пользователя:
//user.comComponent.ts
импортировать {Component, OnInit} из '@angular/core';
импортировать { UserService } из «src/app/services/user.service»;
@Компонент({
селектор: 'app-user',
templateUrl: './user.comComponent.html',
styleUrls: ['./user.comComponent.scss']
})
класс экспорта UserComponent реализует OnInit {
публичный список: любой = []
конструктор(
частный userService только для чтения: UserService
) { }
ngOnInit(): пустота {
если (localStorage.getItem('пользователи')) {
let obj = localStorage.getItem('users') ||
this.list = JSON.parse(obj)
} еще {
это.getList()
}
}
// Получаем список пользователей getList() {
this.userService.getUserList().subscribe({
следующий: (данные: любые) => {
localStorage.setItem('пользователи', JSON.stringify(data.users))
этот.список = данные.пользователи
},
ошибка: (ошибка: любая) => {
console.log(ошибка)
}
})
}
} Поскольку серверная служба не представлена, здесь мы используем localstorage для записи статуса.
После выполнения вышеизложенного мы получаем следующую информацию о списке:

Чтобы добавлять и редактировать пользователей,
мы просто создаем форму, которая содержит всего два поля, а именно name и position . Эти две функции имеют общую форму ~
мы добавляем ее в html :
// user-info.comComponent.html
<form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()">
<nz-форма-элемент>
<nz-form-control nzErrorTip="Пожалуйста, введите имя пользователя!">
<input type="text" nz-input formControlName="username" Placeholder="Пожалуйста, введите имя пользователя" style="width: 160px;" />
</nz-form-control>
</nz-form-item>
<nz-форма-элемент>
<nz-form-control nzErrorTip="Пожалуйста, введите позицию!">
<input type="text" nz-input formControlName="position" Placeholder="Пожалуйста, введите позицию" style="width: 160px;"/>
</nz-form-control>
</nz-form-item>
<button nz-button class="login-form-button login-form-margin" [nzType]="'primary'">Подтвердить</button>
</form> Страница выглядит следующим образом:

Затем возникает логическое решение: добавить или изменить. Если соединение отмечено uuid , это означает редактирование, show you the codes .
// пользователь-информация.компонент.ts
импортировать {Component, OnInit} из '@angular/core';
импортировать { FormBuilder, FormGroup, Валидаторы } из '@angular/forms';
импортировать {ActivatedRoute, ParamMap} из '@angular/router';
@Компонент({
селектор: 'app-user-info',
templateUrl: './user-info.comComponent.html',
styleUrls: ['./user-info.comComponent.scss']
})
класс экспорта UserInfoComponent реализует OnInit {
общественный isAdd: логическое значение = true;
общедоступная информация пользователя: любой = []
общедоступный UUID: число = 0;
проверить форму!: FormGroup;
конструктор(
частный Facebook: FormBuilder,
частный маршрут: ActivatedRoute,
) { }
ngOnInit(): пустота {
this.userInfo = JSON.parse(localStorage.getItem('users') || '[]')
this.route.paramMap.subscribe((params: ParamMap)=>{
this.uuid = parseInt(params.get('uuid') || '0')
})
// Это состояние редактирования, устанавливаем идентификатор if(this.uuid) {
this.isAdd = ложь
}
если (this.isAdd) {
this.validateForm = this.fb.group({
имя пользователя: [null, [Validators.required]],
позиция: [null, [Validators.required]]
});
} еще {
let current = (this.userInfo.filter((item: Any) => item.uuid === this.uuid))[0] ||
// Информационное заполнение this.validateForm = this.fb.group({
имя пользователя: [текущее.имя, [Валидаторы.требуются]],
позиция: [текущая.позиция, [Валидаторы.требуются]]
})
}
}
submitForm() {
// Если он не соответствует отправке, будет сообщено об ошибке if(!this.validateForm.valid) {
Object.values(this.validateForm.controls).forEach((контроль: любой) => {
если (управление?.инвалид) {
контроль?.markAsDirty();
control?.updateValueAndValidity({ onlySelf: true });
}
})
возвращаться
}
// Получаем данные формы const data = this.validateForm.value
//Добавляем нового пользователя 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),
имя: данные.имя пользователя,
позиция: data.position
})
localStorage.setItem('users', JSON.stringify(this.userInfo))
} else { //Редактируем пользователя, обновляем информацию let mapList = this.userInfo.map((item: Any) => {
if(item.uuid === this.uuid) {
возвращаться {
uuid: this.uuid,
имя: данные.имя пользователя,
позиция: data.position
}
}
возврат товара
})
localStorage.setItem('пользователи', JSON.stringify(mapList))
}
}
} Сначала мы устанавливаем идентификатор isAdd , который по умолчанию соответствует новому пользователю; если uuid существует, устанавливаем для него false значение, указывающее, что он находится в состоянии редактирования, и заполняет форму содержимым. Операция отправки формы также оценивается по этому идентификатору. Мы напрямую изменяем информацию localStorage , чтобы обеспечить синхронизацию информации списка.
Для функции удаления
мы вводим модальное диалоговое окно с вопросом, следует ли удалять.
// пользователь.компонент.ц
// Удалить delete(data: Any) {
this.modal.confirm({
nzTitle: '<i>Хотите удалить этого пользователя?</i>',
nzOnOk: () => {
пусть пользователи = JSON.parse(localStorage.getItem('users') || '[]');
let filterList = user.filter((item: Any) => item.uuid !== data.uuid);
localStorage.setItem('users', JSON.stringify(filterList));
this.list = список фильтров
}
});
} 
Мы находим удаленные данные, удаляем их, повторно кэшируем новые пользовательские данные и обновляем данные списка пользователей table .
Итак, на данный момент мы успешно завершили простой проект. Давайте посмотрим на это в целом, используя Gif .

【над】