Angular - Работа с DELETE запросами

Внимание

Данный материал является частью цикла статей «Frontend приложение на Angular». Не забудьте посмотреть другие статьи по этой теме :-)

  1. Angular - Подготовка проекта для нового приложения
  2. Angular - навигация и маршрутизация
  3. Angular - HttpClient, сервисы и файлы окружения
  4. Angular - Ленивая загрузка данных (lazy loading)
  5. Angular - обработка ошибок
  6. Angular - декораторы и директивы @Input и @Output
  7. Angular - валидация формы и POST запрос
  8. Angular - Работа с запросами PUT
  9. Angular - Работа с DELETE запросами

Структура и маршрутизация папок

Выполните команду Angular CLI, которая создаст необходимую структуру папок. Более того, он собирается импортировать компонент OwnerDelete внутри файла owner.module.ts:

ng g component owner/owner-delete --skipTests

Кроме того, мы должны изменить файл owner.module.ts, чтобы включить маршрутизацию для этого компонента:

RouterModule.forChild([
      { path: 'list', component: OwnerListComponent },
      { path: 'details/:id', component: OwnerDetailsComponent },
      { path: 'create', component: OwnerCreateComponent },
      { path: 'update/:id', component: OwnerUpdateComponent},
      { path: 'delete/:id', component: OwnerDeleteComponent }
    ])
  ]

Кроме того, давайте изменим файлы owner-list.component.html и owner-list.component.ts, чтобы включить навигацию на страницу удаления:

<button type="button" id="delete" class="btn btn-danger" (click)="redirectToDeletePage(owner.id)">Delete</button>
public redirectToDeletePage = (id) => { 
  const deleteUrl: string = `/owner/delete/${id}`; 
  this.router.navigate([deleteUrl]); 
}

Обработка угловых действий удаления в HTML-файле

Чтобы создать HTML-часть компонента, начнем с кода оболочки:

<div class="container-fluid">
  <div class="row">
    <div class="col-md-10 card card-body bg-light mb-2 mt-2">

    </div>
  </div>
  <br>
</div>

Внутри div с классом col-md-10 мы собираемся показать все детали сущности, которую хотим удалить:

<div class="row">
  <div class="col-md-3">
    <label for="name" class="control-label">Owners name:</label>
  </div>
  <div class="col-md-7">
    <span name="name">
      {{owner?.name}}
    </span>
  </div>
</div>

<div class="row">
  <div class="col-md-3">
    <label for="dateOfBirth" class="control-label">Date of birth:</label>
  </div>
  <div class="col-md-7">
    <span name="dateOfBirth">
     {{owner?.dateOfBirth | date: 'MM/dd/yyyy'}}
    </span>
  </div>
</div>

<div class="row">
  <div class="col-md-3">
    <label for="address" class="control-label">Address:</label>
  </div>
  <div class="col-md-7">
    <span name="address">
      {{owner?.address}}
    </span>
  </div>
</div>

Прямо под тегом <br/> добавим кнопки:

<div class="row">
  <div class="col-md-offset-8 col-md-1">
    <button type="submit" class="btn btn-info" (click)="deleteOwner()">Delete</button>
  </div>
  <div class="col-md-1">
    <button type="button" class="btn btn-danger" (click)="redirectToOwnerList()">Cancel</button>
  </div>
</div>

Наконец, мы собираемся добавить наши пользовательские модальные компоненты:

<app-success-modal [modalHeaderText]="'Success message'" 
  [modalBodyText]="'Action completed successfully'" 
  [okButtonText]="'OK'"
  (redirectOnOK)="redirectToOwnerList()"></app-success-modal>

<app-error-modal [modalHeaderText]="'Error message'" 
  [modalBodyText]="errorMessage" 
  [okButtonText]="'OK'"></app-error-modal>

Наша HTML-часть компонента готова. Все, что нам нужно сделать, это реализовать бизнес-логику.

Обработка действий удаления Angular в файле компонента

Измените файл owner-delete.copmonent.ts, импортировав все необходимые ресурсы и добавив сервисы в конструктор:

import { Component, OnInit } from '@angular/core';
import { ErrorHandlerService } from './../../shared/services/error-handler.service';
import { RepositoryService } from './../../shared/services/repository.service';
import { Owner } from './../../_interfaces/owner.model';
import { Router, ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-owner-delete',
  templateUrl: './owner-delete.component.html',
  styleUrls: ['./owner-delete.component.css']
})
export class OwnerDeleteComponent implements OnInit {
  public errorMessage: string = '';
  public owner: Owner;

constructor(private repository: RepositoryService, private errorHandler: ErrorHandlerService, private router: Router,
  private activeRoute: ActivatedRoute) { }

}

Ниже конструктора мы собираемся добавить логику для получения владельца и перенаправления на компонент списка владельцев:

ngOnInit() {
  this.getOwnerById();
}

private getOwnerById = () => {
  const ownerId: string = this.activeRoute.snapshot.params['id'];
  const ownerByIdUrl: string = `api/owner/${ownerId}`;

  this.repository.getData(ownerByIdUrl)
    .subscribe(res => {
      this.owner = res as Owner;
    },
    (error) => {
      this.errorHandler.handleError(error);
      this.errorMessage = this.errorHandler.errorMessage;
    })
}

public redirectToOwnerList = () => {
  this.router.navigate(['/owner/list']);
}

Наконец, давайте реализуем логику удаления прямо под функцией redirectToOwnerList:

public deleteOwner = () => {
  const deleteUrl: string = `api/owner/${this.owner.id}`;
  this.repository.delete(deleteUrl)
    .subscribe(res => {
      $('#successModal').modal();
    },
    (error) => {
      this.errorHandler.handleError(error);
      this.errorMessage = this.errorHandler.errorMessage;
    })
}

Вот и все. Мы закончили нашу Angular часть этого приложения. В результате у нас есть полнофункциональное приложение, готовое к развертыванию. Поэтому все, что нам осталось сделать, - это подготовить файлы Angular для производства и развернуть готовое приложение в среде Windows и Linux.

Заключение

Прочитав этот пост, вы узнали:

  • Как создать HTML-часть действия удаления
  • Как отправить запрос DELETE на сервер

Спасибо, что прочитали этот пост, надеюсь, он был вам полезен.