美文网首页
Angualr 访问远程 API (2)

Angualr 访问远程 API (2)

作者: 品品下午茶 | 来源:发表于2022-05-23 19:35 被阅读0次

上一篇文章中,我们了解了如何模拟远程服务接口,并通过访问远程接口检索图书信息。

本文将继续介绍如何实现 CRUD 中的其他三个操作:创建(C)、更新(U)和删除(D)操作。

创建操作

首先,我门在图书列表中增加一本图书。

  1. BookService 中,添加一个方法,接受图书名称作为参数,返回 Book 类型的 Observable.

src/app/books/book.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from "@angular/common/http";
import { Book } from './book.model';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class BookService {

  private booksUrl = 'api/books/'

  constructor(private http: HttpClient) { }

  // Get all books
  getBooks(): Observable<Book[]> {
    return this.http.get<Book[]>(this.booksUrl);
  }

  // Create a new book
  createBook(name: string): Observable<Book> {
    const book = { name };
    return this.http.post<Book>(this.booksUrl, book);
  }
}
  1. 在组件类 BookListComponent 中,创建一个 add 方法,接受图书名称作为参数。该方法订阅 BookServicecreateBook 方法,将其返回的图书信息,添加到图书列表中。

src/app/books/book-list/book-list.component.ts

import { Component, OnInit } from '@angular/core';
import { Book } from '../book.model';
import { BookService } from '../book.service';

@Component({
  selector: 'app-book-list',
  templateUrl: './book-list.component.html',
  styleUrls: ['./book-list.component.css']
})
export class BookListComponent implements OnInit {

  books: Book[];

  constructor(private bookService: BookService) {
  }

  ngOnInit(): void {
    this.getBooks();
  }

  // Get all books.
  private getBooks() {
    this.bookService.getBooks().subscribe(books => this.books = books);
  }

  // Add a new book.
  add(name: string) {
    this.bookService.createBook(name).subscribe(book => this.books.push(book));
  }

}
  1. 修改组件模板文件 book-list.component.html,放置一个添加图书的按钮。

src/app/books/book-list/book-list.component.html

<h3>科幻图书</h3>
<ul>
  <li *ngFor="let book of books">{{book.name}}</li>
</ul>
<div>
  <button (click)="add('《球状闪电》')">添加《球状闪电》</button>
</div>

更新操作

然后,我门修改一本现有图书的名称。

  1. BookService 中,添加一个方法,接受图书的id和实例对象作为参数,返回 any 类型的 Observable.

src/app/books/book.service.ts

...

@Injectable({
  providedIn: 'root'
})
export class BookService {

...

  // Edit an existing book
  editBook(id: number, book: Book): Observable<any> {
    return this.http.put(this.booksUrl + id, book);
  }
}
  1. 在组件类 BookListComponent 中,创建一个 rename 方法,接受图书实例对象作为参数。该方法订阅 BookServiceeditBook 方法,在其成功执行后,修改指定 id 图书的名称。

src/app/books/book-list/book-list.component.ts

...

@Component({
  selector: 'app-book-list',
  templateUrl: './book-list.component.html',
  styleUrls: ['./book-list.component.css']
})
export class BookListComponent implements OnInit {

...

  // rename a book's name
  rename(book: Book) {
    const existingBook = { id: book.id, name: '《叁体》', price: 50.00};
    this.bookService.editBook(book.id, existingBook).subscribe(() => {
      this.books.find(book => book.id).name = "《叁体》";
    });
  }

}
  1. 修改组件模板文件 book-list.component.html,放置一个重命名图书的按钮。

src/app/books/book-list/book-list.component.html

...
<div>
  <button (click)="rename(books[0])">重命名<三体>为<叁体></button>
</div>

删除操作

然后,我门删除一本现有图书。

  1. BookService 中,添加一个方法,接受图书的id作为参数,返回 any 类型的 Observable.

src/app/books/book.service.ts

...

@Injectable({
  providedIn: 'root'
})
export class BookService {

...

  // Delete an existing book
  deleteBook(id: number): Observable<any> {
    return this.http.delete(this.booksUrl + id);
  }
}
  1. 在组件类 BookListComponent 中,创建一个 remove 方法,接受图书的id作为参数。该方法订阅 BookServicedeleteBook 方法,在其成功执行后,从图书列表中移除指定 id 图书。

src/app/books/book-list/book-list.component.ts

...

@Component({
  selector: 'app-book-list',
  templateUrl: './book-list.component.html',
  styleUrls: ['./book-list.component.css']
})
export class BookListComponent implements OnInit {

...

  remove(book: Book) {
    this.bookService.deleteBook(book.id).subscribe(()=>{
      this.books = this.books.filter(selected => selected !== book);
    });
  }

}
  1. 修改组件模板文件 book-list.component.html,放置一个删除图书的按钮。

src/app/books/book-list/book-list.component.html

...
<div>
  <button (click)="remove(books[2])">删除《死神永生》</button>
</div>

相关文章

网友评论

      本文标题:Angualr 访问远程 API (2)

      本文链接:https://www.haomeiwen.com/subject/ugfdprtx.html