В этой статье я объясню, как мы можем создать таблицу данных с помощью angular, используя ag-Grid . Кроме того, приложение будет использовать сторонний разбитый на страницы REST API и загружать данные в таблицу.
Здесь я использую API, который мы разработали для нашей статьи о Разбивке на страницы, сортировке и фильтрации Spring Boot .
Окончательный Результат Разработки
Технологии, которые я собираюсь использовать во внешнем интерфейсе,
- Угловой 10.1.5
- ag-Сетка
- Угловой HttpClient
Основные темы внутри статьи,
- Запущенный и работающий серверный REST API
- Разработка проекта Angular JS
- Добавление ag-Grid в Начатый проект
- API-сервис для использования REST API
- Компонент Для Демонстрации Реализации ag-Grid
- Настройка Имени Автора С Помощью Пользовательского Анализатора Строк
- Отображение Изображения На ag-Сетке
- Вывод
Запущенный и работающий серверный REST API
Здесь, как я упоминал выше, я буду использовать API, который мы разработали в нашем предыдущем руководстве, Сначала загрузите исходные коды для этого Spring boot REST API отсюда.
$ git clone https://github.com/javatodev/spring-boot-mysql-pagination-filtering-sorting.git
После загрузки проекта измените src/main/resources/application.properties , чтобы подключиться к предпочтительному экземпляру MySQL на вашей стороне.
server.port=8081 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/java_to_dev_api_mysql spring.datasource.username=root spring.datasource.password= spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
Измените эти свойства соответствующим образом, чтобы получить доступ к экземпляру MySQL на вашем компьютере.
Затем запустите приложение, используя следующую команду,
$ ./gradlew bootRun
Затем вы можете проверить статус API, просто перейдя по следующему URL-адресу из своего браузера или используя CURL в командной строке,
http://localhost:8081/api/library/book/search?page=0&size=2
Он должен возвращать пустой список или список книг вместе с количеством элементов и количеством страниц, если данные доступны в вашей базе данных, после правильной настройки и запуска.
Я добавил простую конечную точку API для записи фиктивного набора данных в базу данных.
{ "bookList": [ { "id": 2, "name": "Unlocking Android", "isbn": "1933988673", "imageUrl": "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/ableson.jpg", "author": { "id": 3, "firstName": "W. Frank", "lastName": "Ableson" } }, { "id": 3, "name": "Android in Action, Second Edition", "isbn": "1935182722", "imageUrl": "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/ableson2.jpg", "author": { "id": 3, "firstName": "W. Frank", "lastName": "Ableson" } } ], "numberOfItems": 400, "numberOfPages": 200 }
Если вам нужно больше данных для тестирования этого API, просто запустите следующий API, затем он создаст некоторый образец набора данных в базе данных. Добавьте автора в базу данных перед запуском этого API.
curl -X POST http://localhost:8081/api/library/create
Теперь у нас есть работающий API, который работает правильно.
Если вы не знакомы с приложением на основе Spring Boot, вы можете использовать следующий Поддельный REST API из instantwebtools.сеть, которая находится в сети и бесплатна для использования с этим руководством. Одна вещь будет изменена, так как этот API возвращает другую структуру данных, но вы также можете настроить это с помощью этого приложения.
У них есть эта конечная точка API, которая возвращает разбитый на страницы ответ из их API, и у нее есть все параметры, которые нам нужны в этом руководстве.
https://api.instantwebtools.net/v1/passenger?page=0&size=10
Разработка проекта Angular JS
Если у вас нет базовой настройки для разработки проекта angular JS, просто следуйте этому documentation , чтобы установить и настроить Angular CLI перед началом этого руководства.
Здесь я использую angular CLI (10.1.5) для создания нашего базового проекта для этого урока.
Сначала сгенерируйте свой проект с помощью следующей команды и добавьте в ту же команду, затем он сгенерирует наше базовое приложение со всеми компонентами, которые необходимо иметь в приложении angular с поддержкой маршрутизации.
$ ng new angular-js-datatable-with-spring-boot-api --routing=true
Затем выберите понравившийся вам вариант на следующих этапах после приведенной выше команды, Для моих источников я использую следующие параметры, но вы можете использовать любой вариант, который вам нравится.
- Какой формат таблицы стилей вы хотели бы использовать? – CSS
Хорошо, теперь у нас есть наш новый проект angular 10 с интеграцией модулей маршрутизации.
Добавление ag-Grid в Начатый проект
$ npm install --save ag-grid-community ag-grid-angular
теперь все модули, связанные с ag-grid, должны быть добавлены в проект. Затем давайте добавим модуль ag-Grid Angular в наш модуль приложения (src/app/app.module.ts)
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { AgGridModule } from 'ag-grid-angular'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ AppComponent, ], imports: [ BrowserModule, AppRoutingModule, AgGridModule.withComponents([]), NgbModule, HttpClientModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Кроме того, я настраиваю Http-клиентский модуль с помощью этого приложения, поскольку он будет использоваться для связи с REST API.
После этого добавьте следующий импорт CSS в src/styles.css или styles.scss, чтобы получить темы ag-Grid,
@import "../node_modules/ag-grid-community/dist/styles/ag-grid.css"; @import "../node_modules/ag-grid-community/dist/styles/ag-theme-alpine.css";
Теперь мы готовы приступить к внедрению ag-grid.
API-сервис для использования REST API
Здесь мы используем отдельный класс сервиса для взаимодействия с REST API. создайте новую службу, используя следующую команду.
$ ng g s api
Затем добавьте следующее содержимое в src/app/api.service.ts. Здесь я разрабатываю метод сервиса для приема размера страницы и номера страницы, а затем извлекаю разбитый на страницы ответ API из API, используя эти параметры.
import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class ApiService { constructor(private client: HttpClient) {} getAllBooks(pageSize: Number, pageNumber: Number): Observable{ const url = "http://localhost:8081/api/library/book/search?size="+pageSize+"&page="+pageNumber; return this.client.get(url); } }
Компонент Для Демонстрации Реализации ag-Grid
Здесь мы используем отдельный компонент для построения представления ag-Grid. Поэтому сначала создайте новый компонент и добавьте параметр маршрутизатора, чтобы показать его с корневым URL-адресом.
$ ng g c Dashboard
Затем добавьте следующее в src/app/app.routing.module.ts, чтобы настроить маршруты.
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { DashboardComponent } from './dashboard/dashboard.component'; const routes: Routes = [ { path: "", component: DashboardComponent } ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
Затем удалите все содержимое из src/app/app.component.html , и добавьте следующее,
Готово, теперь мы внедрили новый компонент с маршрутизацией, затем мы должны сосредоточиться на добавлении компонента таблицы данных.
Сначала добавьте следующее в src/app/dashboard/dashboard.component.ts,
на данный момент я собираюсь установить только два столбца в таблице данных с именем и ISBN из book API.
итак, в основном вам нужно установить columnDefs с правильным именем поля полностью в соответствии с любыми данными, поступающими из нашего API.
Затем все данные, поступающие из API, будут привязаны к массиву данных строк, и тип модели строк будет установлен на “бесконечный”, а размер страницы по умолчанию будет равен 10.
при загрузке сетки будет вызван метод on Grid Ready, который установит источник данных с помощью API-сервиса, а параметры будут записаны с помощью gridApi.paginationGetPageSize() и gridApi.paginationGetCurrentPage() и будут доступны для всего приложения для текущего сеанса.
После успешного извлечения данные будут настроены на успешный обратный вызов.
Кроме того, onPageSizeChanged будет использоваться для настройки изменений размера страницы.
import { Component, OnInit } from '@angular/core'; import { IDatasource, IGetRowsParams } from 'ag-grid-community'; import { ApiService } from '../api.service'; @Component({ selector: 'app-new-dashboard', templateUrl: './new-dashboard.component.html', styleUrls: ['./new-dashboard.component.css'] }) export class NewDashboardComponent implements OnInit { private gridApi: any; private gridColumnApi: any; constructor(private api: ApiService) { } columnDefs = [ { field: 'name', sortable: true, filter: true , flex: 1, minWidth: 100}, { field: 'isbn', sortable: true, filter: true , flex: 1, minWidth: 100} ]; rowData = []; rowModelType = 'infinite'; defaultPageSize = 10; ngOnInit(): void { } onGridReady(params: any) { this.gridApi = params.api; this.gridColumnApi = params.columnApi; this.gridApi.setDatasource(this.dataSource); } dataSource: IDatasource = { getRows: (params: IGetRowsParams) => { this.api.getAllBooks(this.gridApi.paginationGetPageSize(), this.gridApi.paginationGetCurrentPage()).subscribe(response => { params.successCallback( response.bookList, response.numberOfItems ); }) } } onPageSizeChanged(event: any) { this.gridApi.paginationSetPageSize(Number(event.target.value)); } }
Теперь добавьте следующее в src/app/dashboard/dashboard.component.html , это часть пользовательского интерфейса для вашей таблицы данных, и есть незавершенные изменения, которые нам нужно внести на стороне typescript.
Datatable with Ag-Grid + Angular With Spring Boot REST API
Page Size:
с помощью ag-grid нам нужно настроить компонент выбора размера страницы на заказ. Вот почему я разработал метод select with onPageSizeChanged для установки выбранного пользователем размера страницы.
Затем запустите проект со следующей командой,
$ ng serve --open
Следующий пользовательский интерфейс должен присутствовать при доступе к http://localhost:4200 в вашем браузере.
Все сделано с помощью базовой реализации. давайте добавим еще несколько изменений для отображения изображений и пользовательских строковых столбцов.
Настройка Имени Автора С Помощью Пользовательского Анализатора Строк
Здесь наш API отправляет имя и фамилию автора в двух параметрах.
{ "id": 2, "name": "Unlocking Android", "isbn": "1933988673", "imageUrl": "https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/ableson.jpg", "author": { "id": 3, "firstName": "W. Frank", "lastName": "Ableson" } }
Поэтому, если нам нужно отобразить оба параметра в одном столбце в ag-grid, мы можем использовать valueGetter и установить для нашего пользовательского анализатора значение getter. Затем он установит проанализированное имя автора в этом столбце.
Добавьте следующий метод в src/app/dashboard/dashboard.component.ts
nameParser(params:any) { if (params.data != null) { return params.data.author.firstName+" "+params.data.author.lastName; } return ""; }
Затем измените следующее определение столбца на columnDefs,
columnDefs = [ { field: 'name', sortable: true, filter: true , flex: 1, minWidth: 100}, { field: 'isbn', sortable: true, filter: true , flex: 1, minWidth: 100}, { valueGetter: this.nameParser , flex: 1, minWidth: 100, headerName: 'Author'} ];
Все сделано, теперь в нашей таблице данных может отображаться имя автора с объединением имени и фамилии.
Отображение Изображения На ag-Сетке
Теперь наша последняя колонка, Изображение для книги. Наш API отправляет прямой URL-адрес на изображение. Поэтому нам просто нужно установить тег с URL-адресом, поступающим из нашего API.
Поэтому для этого мы должны использовать пользовательский компонент и загрузить его вместе с таблицей данных.
Давайте создадим еще один компонент (src/app/Image Formatter Component.ts) с добавлением следующего содержимого.
import { Component } from "@angular/core"; @Component({ selector: 'app-image-formatter-cell', template: `` }) export class ImageFormatterComponent { params: any; agInit(params: any){ this.params = params; } }
Здесь он создает a со значением, которое мы задаем из API.
Затем добавьте этот же компонент в реализацию модуля Ag Grid в src/app/app.module.ts
imports: [ BrowserModule, AppRoutingModule, AgGridModule.withComponents([ImageFormatterComponent]), NgbModule, HttpClientModule ]
Затем вызовите пользовательский компонент, используя среду визуализации ячеек, как показано ниже,
columnDefs = [ { field: 'name', sortable: true, filter: true , flex: 1, minWidth: 100}, { field: 'isbn', sortable: true, filter: true , flex: 1, minWidth: 100}, { valueGetter: this.nameParser , flex: 1, minWidth: 100, headerName: 'Author'}, { field: 'imageUrl' , autoHeight: true, flex: 1, minWidth: 100, headerName: 'Image', cellRendererFramework: ImageFormatterComponent} ];
Теперь наше приложение почти завершено со всеми необходимыми определениями столбцов.
Все сделано, теперь мы завершили всю реализацию с помощью ag-grid в проекте angular с использованием REST API.
Вывод
Все сделано, теперь я надеюсь, что вы хорошо понимаете, как разработать интерфейс angularjs с datatable с помощью ag-grid и как настроить его для использования разбитого на страницы REST API, разработанного с использованием Spring Boot. Прокомментируйте свои идеи или проблемы, с которыми вы сталкиваетесь во время разработки. Я с нетерпением жду ответа на эти вопросы.
Вы можете найти исходные коды для этого руководства на нашем Github .
Оригинал: “https://dev.to/javatodev/angular-datatable-with-pagination-using-ag-grid-and-rest-api-5cf5”