После поиска учебников я вернулся к Официальному примеру , который оказался очень интуитивным.
У меня было такое же требование к вашему вопросу, просто загрузите данные один раз и управляйте манипуляциями на стороне клиента.
Однако я прекратил обработку манипуляций на стороне сервера.
Позвольте мне сделать предположение, у вас есть конечная точка, которая возвращает список объектов.
/ апи / книги /
1: Создать службу с помощью метода http-call для получения конечной точки ваших книг (book.service.ts)
private booksUrl = "/api/books";
_getBooks(bookId: number, filter='', sortOrder='asc', pageNumber=0,
pageSize=3):Observable<Book[]>{
return this.http.get(this.booksUrl, {
params: new HttpParams()
.set('bookId', _bookId.toString())
.set('filter', filter)
.set('sortOrder', sortOrder)
.set('pageNumber', pageNumber.toString())
.set('pageSize', pageSize.toString())
}).pipe(
tap(_ => this.log('fetched books')),
catchError(this.handleError('getBooks', [])),
map(res => {
res["payload"] = res;
return res["payload"];
})
);
}
Определите класс вашей Книги
export class Book{
bookId: string;
Title: string;
}
Затем я создал компонент Material-Table, используя схемы таблицы данных.
Я отредактировал источник данных таблицы как таковой
import { Book } from '../books';
import { BookService } from '../book.service';
/**
* Data source for the Masterlist view. This class should
* encapsulate all logic for fetching and manipulating the displayed data
* (including sorting, pagination, and filtering).
*/
export class BooksDataSource implements DataSource<Book> {
private booksSubject = new BehaviorSubject<Book[]>([]);
private loadingSubject = new BehaviorSubject<boolean>(false);
public loading$ = this.loadingSubject.asObservable();
constructor(private bookService: BookService) {}
/**
* Connect this data source to the table. The table will only update when
* the returned stream emits new items.
* @returns A stream of the items to be rendered.
*/
connect( collectionViewer:CollectionViewer): Observable<Book[]> {
return this.booksSubject.asObservable();
}
/**
* Called when the table is being destroyed. Use this function, to clean up
* any open connections or free any held resources that were set up during connect.
*/
disconnect(collectionViewer: CollectionViewer): void {
this.booksSubject.complete();
this.loadingSubject.complete();
}
loadBooks(bookId: number, filter = '', sortDirection = 'asc', pageIndex = 0, pageSize = 3) {
this.loadingSubject.next(true);
this.bookService._getBook(bookId, filter, sortDirection,pageIndex, pageSize).pipe(
catchError(e => throwError(e)),
finalize(() => this.loadingSubject.next(false))
)
.subscribe(_books => this.booksSubject.next(_books));
}
}
Наконец, на Books.Components.ts (ваш компонент)
export class BooksComponent implements OnInit {
constructor(private bookService: BookService){}
dataSource: BooksDataSource;
/** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */
displayedColumns = ['bookId', 'Title'];
ngOnInit() {
this.dataSource = new MasterlistDataSource(this.bookService);
this.dataSource.loadBooks(1);
}
}
Отсюда вы можете сопоставить источник данных со своей таблицей.
Официальный пример продолжает показывать, как реализовать сортировку, разбиение на страницы, фильтрацию.
Счастливое кодирование: -)