Угловой материал - Часть 4: Таблица данных
Это сообщение было впервые опубликовано на CodingTheSmartWay.com.
Это четвертая часть серии Angular Material на CodingTheSmartWay.com. В этой части мы сосредоточимся на таблицах данных. Конечно, в этой части снова предполагается, что вы знакомы с библиотекой материалов Angular в целом и знаете, как настроить проект Angular и установить библиотеку материалов Angular в этом проекте. Если вы новичок в Angular Material, пожалуйста, сначала взгляните на первую часть этой серии: Angular Material - Part 1 Introduction или посетите веб-сайт Angular Material по адресу https://material.angular.io.
Если вы хотите узнать о Angular Material Dialogs, Tooltips и SnackBars, вам также следует изучить вторую часть. Для элементов навигации Angular Material (меню, боковая навигация и панели инструментов) ознакомьтесь с третьей частью.
Начнем с четвертой части. Следующие шаги предполагают, что вы уже настроили новый проект Angular 4 и включили библиотеку материалов Angular.
Начало работы с таблицами данных материалов Angular
Подготовка проекта
Чтобы продемонстрировать использование таблиц данных, давайте сначала добавим в проект новый компонент с помощью Angular CLI:
$ ng g component components/usertable
Эта команда создает следующие новые файлы в структуре вашего проекта:
- src / app / components / usertable / usertable.component.css
- src / app / components / usertable / usertable.component.ts
- src / app / components / usertable / usertable.component.html
- src / app / components / usertable / usertable.component.spec.ts
Позже мы будем использовать user usertable.component.ts и usertable.component.html для реализации вывода таблицы. Но перед этим давайте сначала добавим сервис в наше приложение Angular, используя следующую команду:
$ ng g service services/user
Эта команда добавляет в проект следующие новые файлы:
- src / app / services / user.service.ts
- src / app / services / user.service.spec.ts
Затем нам нужно импортировать MatTableModule в app.module.ts. Добавьте следующий оператор импорта:
import { MatTableModule } from '@angular/material';
Кроме того, добавьте оператор импорта для Angular HttpModule в начало этого файла:
import { HttpClientModule } from '@angular/common/http';
Мы будем использовать службу HttpClient (которая является частью HttpClientModule) в UserService для запроса пользовательских данных из веб-службы.
Также добавьте модули в массив импорта @NgModule:
imports: [ BrowserModule, BrowserAnimationsModule, HttpClientModule, MatTableModule ],
UserService необходимо включить в app.module.ts:
import { UserService } from './services/user.service';
Чтобы сделать эту службу доступной для всех наших компонентов, ее необходимо добавить в массив sizes декоратора @NgModule, как вы можете видеть на следующем рисунке:
providers: [UserService],
Реализация UserService
Перед отображением данных в таблице данных материалов Angular нам сначала нужно получить эти данные. Данные, которые мы хотим отображать, являются записями пользователей из веб-службы https://jsonplaceholder.typicode.com/users. Открытие этого URL-адреса в браузере возвращает пользовательские записи в формате JSON, как вы можете видеть на следующем снимке экрана:
Чтобы получить данные о пользователях из этой веб-службы, мы сначала реализуем UserService. Вставьте следующий код в файл user.service.ts: c
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/map'; import { User } from '../models/user.model';
@Injectable() export class UserService {
private serviceUrl = 'https://jsonplaceholder.typicode.com/users'; constructor(private http: HttpClient) { } getUser(): Observable<User[]> { return this.http.get<User[]>(this.serviceUrl); } }
Это типичный сервис Angular. Служба Http внедряется в класс службы, а метод службы getUser отправляет HTTP-запрос на получение URL-адреса внешней службы для извлечения данных. Эти методы возвращают Observable типа User []. Пользователь - это настраиваемый класс модели, который импортируется из src / app / models / user.model.ts. Этот файл еще не создан, поэтому нам нужно сделать это сейчас. Создайте этот новый файл, а затем вставьте следующий код, чтобы сделать доступным тип данных User:
export interface User {
name: string;
email: string;
phone: string;
company: {
name: string;
}
}
Реализация UsertableComponent
Затем давайте добавим реализацию для UsertableComponent в наше приложение. Начните со вставки следующего кода шаблона в файл usertable.component.html:
<div>
<mat-table [dataSource]="dataSource">
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.name}} </mat-cell>
</ng-container>
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef> E-Mail </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.email}} </mat-cell>
</ng-container>
<ng-container matColumnDef="phone">
<mat-header-cell *matHeaderCellDef> Phone </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.phone}} </mat-cell>
</ng-container>
<ng-container matColumnDef="company">
<mat-header-cell *matHeaderCellDef> Company </mat-header-cell>
<mat-cell *matCellDef="let user"> {{user.company.name}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
</div>
Здесь мы используем элемент <mat-table></mat-table>
для включения таблицы из библиотеки материалов Angular. Свойство dataSource этого элемента привязано к dataSource. dataSource - это объект типа DataSource, который будет реализован на следующем шаге.
Для каждого столбца таблицы используется элемент <ng-container>
и применяется директива matColumnDef. Этой директиве присваивается строка с именем этих столбцов.
Внутри элемента <ng-container>
каждый столбец состоит из
- Элемент
<mat-header-cell>
, к которому применяется директива * matHeaderCellDef. Этот элемент содержит текст заголовка, который отображается в верхней части столбца. - Элемент
<mat-cell>
, содержащий содержимое ячейки. Здесь необходимо применить директиву * matCellDef и присвоить строку let user. Назначая эту строку, мы гарантируем, что сможем получить доступ к текущему элементу из источника данных через user.
Для завершения реализации шаблона нам нужно включить еще два элемента перед закрывающим тегом </mat-table>
:
- Необходимо добавить элементы
<mat-header-row>
и к этим элементам нужно добавить директиву * matHeaderRowDef. Этой директиве присваивается строка, содержащая имя массива, содержащего имена столбцов, которые должны отображаться в таблице. Массив displayColumns будет определен в реализации класса UsertableComponent на следующем шаге. - Затем добавляется элемент
<mat-row>
и добавляется директива * matRowDef.
После реализации кода шаблона мы можем продолжить реализацию соответствующего класса компонента в файле usertable.component.ts:
import { Component, OnInit } from '@angular/core'; import { UserService } from '../../services/user.service'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/observable/of'; import {DataSource} from '@angular/cdk/collections'; import { User } from '../../models/user.model';
@Component({ selector: 'usertable', templateUrl: './usertable.component.html', styleUrls: ['./usertable.component.css'] }) export class UsertableComponent implements OnInit { dataSource = new UserDataSource(this.userService); displayedColumns = ['name', 'email', 'phone', 'company']; constructor(private userService: UserService) { } ngOnInit() { } }
export class UserDataSource extends DataSource<any> { constructor(private userService: UserService) { super(); } connect(): Observable<User[]> { return this.userService.getUser(); } disconnect() {} }
Сначала давайте посмотрим на реализацию класса UsertableComponent. Класс использует UserService. Сервис внедряется в конструктор класса.
Создаются два свойства класса:
- Члены dataSource инициализируются новым экземпляром UserDataSource, класса, который создается ниже. Объект UserService передается конструктору UserDataSource.
- Массив displayColumns, содержащий список имен столбцов для отображения
Класс UserDataSource создан и расширяет DataSource ‹any›. Этот класс содержит
- Конструктор, который принимает объект UserService в качестве параметра.
- Метод connect, который вызывает метод службы getUser и возвращает Observable типа User [].
- Отключение метода
С этой реализацией конечный результат должен выглядеть так, как вы видите на следующем снимке экрана:
Это сообщение было впервые опубликовано на CodingTheSmartWay.com.
Хотите глубже погрузиться в Angular. Ознакомьтесь со следующими онлайн-курсами:
Онлайн-курс №1: Angular - Полное руководство
Онлайн-курс №2: Угловые - от теории к практике
Онлайн-курс №3: Angular - концепции, код и коллективная мудрость
Отказ от ответственности: это сообщение содержит партнерские ссылки. Это означает, что если вы нажмете на одну из ссылок на продукт, я получу небольшую комиссию. Это поможет поддержать этот блог!