Витрина
PrimeNG/DataView (opens in a new tab)
Dataview отображает данные в виде таблицы или списка с функциями разбиения на страницы, сортировки и фильтрации.
С чего начать
Подключите модуль
import { DataViewModule } from 'primeng/dataview';
В .ts файле
import { Component, OnInit } from '@angular/core';
import { SelectItem } from 'primeng/api';
export interface Product {
id?: string;
code?: string;
name?: string;
description?: string;
price?: number;
quantity?: number;
inventoryStatus?: string;
category?: string;
image?: string;
rating?: number;
}
@Component({
selector: 'app-prime-dataview',
templateUrl: './prime-dataview.component.html',
styleUrls: ['./prime-dataview.component.scss']
})
export class PrimeDataviewComponent implements OnInit {
products: Product[] = [];
sortOptions: SelectItem[] = [];
sortOrder?: number;
sortField = '';
sortKey = '';
status: string[] = ['OUTOFSTOCK', 'INSTOCK', 'LOWSTOCK'];
productNames: string[] = [
'Bamboo Watch',
'Black Watch',
'Blue Band',
'Blue T-Shirt',
'Bracelet',
'Brown Purse',
'Chakra Bracelet',
'Galaxy Earrings',
'Game Controller',
'Gaming Set',
'Gold Phone Case',
'Green Earbuds',
'Green T-Shirt',
'Grey T-Shirt',
'Headphones',
'Light Green T-Shirt',
'Lime Band',
'Mini Speakers',
'Painted Phone Case',
'Pink Band',
'Pink Purse',
'Purple Band',
'Purple Gemstone Necklace',
'Purple T-Shirt',
'Shoes',
'Sneakers',
'Teal T-Shirt',
'Yellow Earbuds',
'Yoga Mat',
'Yoga Set',
];
constructor() { }
ngOnInit(): void {
this.products = [
{
id: '1000',
code: 'f230fh0g3',
name: 'Bamboo Watch',
description: 'Product Description',
image: 'bamboo-watch.jpg',
price: 65,
category: 'Accessories',
quantity: 24,
inventoryStatus: 'INSTOCK',
rating: 5
},
{
id: '1001',
code: 'nvklal433',
name: 'Black Watch',
description: 'Product Description',
image: 'black-watch.jpg',
price: 72,
category: 'Accessories',
quantity: 61,
inventoryStatus: 'INSTOCK',
rating: 4
},
{
id: '1002',
code: 'zz21cz3c1',
name: 'Blue Band',
description: 'Product Description',
image: 'blue-band.jpg',
price: 79,
category: 'Fitness',
quantity: 2,
inventoryStatus: 'LOWSTOCK',
rating: 3
},
{
id: '1003',
code: '244wgerg2',
name: 'Blue T-Shirt',
description: 'Product Description',
image: 'blue-t-shirt.jpg',
price: 29,
category: 'Clothing',
quantity: 25,
inventoryStatus: 'INSTOCK',
rating: 5
},
{
id: '1004',
code: 'h456wer53',
name: 'Bracelet',
description: 'Product Description',
image: 'bracelet.jpg',
price: 15,
category: 'Accessories',
quantity: 73,
inventoryStatus: 'INSTOCK',
rating: 4
},
{
id: '1005',
code: 'av2231fwg',
name: 'Brown Purse',
description: 'Product Description',
image: 'brown-purse.jpg',
price: 120,
category: 'Accessories',
quantity: 0,
inventoryStatus: 'OUTOFSTOCK',
rating: 4
},
{
id: '1006',
code: 'bib36pfvm',
name: 'Chakra Bracelet',
description: 'Product Description',
image: 'chakra-bracelet.jpg',
price: 32,
category: 'Accessories',
quantity: 5,
inventoryStatus: 'LOWSTOCK',
rating: 3
},
{
id: '1007',
code: 'mbvjkgip5',
name: 'Galaxy Earrings',
description: 'Product Description',
image: 'galaxy-earrings.jpg',
price: 34,
category: 'Accessories',
quantity: 23,
inventoryStatus: 'INSTOCK',
rating: 5
},
{
id: '1008',
code: 'vbb124btr',
name: 'Game Controller',
description: 'Product Description',
image: 'game-controller.jpg',
price: 99,
category: 'Electronics',
quantity: 2,
inventoryStatus: 'LOWSTOCK',
rating: 4
},
{
id: '1009',
code: 'cm230f032',
name: 'Gaming Set',
description: 'Product Description',
image: 'gaming-set.jpg',
price: 299,
category: 'Electronics',
quantity: 63,
inventoryStatus: 'INSTOCK',
rating: 3
}
];
this.sortOptions = [
{ label: 'Price High to Low', value: '!price' },
{ label: 'Price Low to High', value: 'price' }
];
}
onSortChange(event: any) {
let value = event.value;
if (value.indexOf('!') === 0) {
this.sortOrder = -1;
this.sortField = value.substring(1, value.length);
}
else {
this.sortOrder = 1;
this.sortField = value;
}
}
}
Встройте компонент с помощью тэга p-dataView. Используйте пример кода, размещенный ниже, в разделе Dataview.
Описание
DataView требует набор элементов в качестве значения и один или несколько шаблонов в зависимости от режима расположения, например, список и сетка.
Расположение
DataView имеет два режима расположения; «список» и «сетка», где отдельный шаблон используется для визуализации элемента в каждом режиме. В режиме списка имя шаблона - «listItem», тогда как в режиме сетки это «gridItem». В режиме сетки элемент ng-template должен содержать элемент div в качестве оболочки с выбранным классом стиля PrimeFlex.
Обратите внимание, что нет ограничений на использование обоих макетов одновременно, вы можете настроить только один макет, используя свойство layout с соответствующим ng-шаблоном.
Разделы
Header и Footer это два раздела, которые могут отображать пользовательский контент.
Dataviewlayoutoptions
Когда в DataView включены оба режима расположения, необходим элемент пользовательского интерфейса, чтобы пользователь мог переключаться между представлениями. p-dataViewLayoutOptions - это вспомогательный компонент для отображения набора кнопок для выбора режима расположения в DataView. Расположение p-dataViewLayoutOptions должно быть внутри компонента DataView. Если вы предпочитаете другой элемент пользовательского интерфейса, вы можете создать свой собственный, который обновляет свойство макета DataView.
Разбивка на страницы
Разбивка на страницы включается, если для свойства paginator задано значение true, атрибут row определяет количество строк на странице, а pageLinks указывает количество отображаемых ссылок на страницы. Чтобы настроить левую и правую части страниц, используйте шаблоны «paginatorLeftTemplate» и «paginatorRightTemplate».
Lazy loading
Ленивый режим удобен для работы с большими наборами данных, вместо загрузки всех данных небольшие куски данных загружаются путем вызова обратного вызова onLazyLoad каждый раз, когда происходит подкачка страниц. Чтобы реализовать отложенную загрузку, включите отложенный атрибут и предоставьте обратный вызов метода, используя onLazyLoad, который фактически загружает данные из удаленного источника данных. onLazyLoad получает объект события, который содержит информацию о том, что загружать. Также важно назначить логическое количество строк для totalRecords, выполнив проекционный запрос для конфигурации paginator, чтобы paginator отображал пользовательский интерфейс, предполагая, что на самом деле есть записи с размером totalRecords, хотя в действительности они не такие, как в режиме lazy, только записи которые отображаются на текущей странице существуют.
Cортировка
Свойства sortField и sortOrder доступны для функциональности сортировки, для гибкости нет встроенного пользовательского интерфейса, поэтому пользовательский интерфейс можно использовать для элемента сортировки. Вот пример, в котором используется раскрывающийся список, в котором простое обновление привязок sortField-sortOrder объекта DataView инициирует сортировку.
Фильтрация
Фильтрация реализуется путем определения свойства filterBy, параметров режима соответствия и вызова функции фильтра компонента, для гибкости нет встроенного пользовательского интерфейса, чтобы пользовательский интерфейс можно было использовать для элемента фильтра. Доступны следующие режимы совпадения: «содержит» (по умолчанию), «старты с», «заканчивается», «равно», «notEquals», «in», «lt», «lte», «gt» и «gte». Вот пример, который использует поле ввода. filterBy является строкой, и несколько полей могут быть определены с помощью списка через запятую.
Элементы пользовательского интерфейса
Как упомянуто выше, селектор опций макета, сортировка и фильтрация встроены, и строгий пользовательский интерфейс не требует создания собственных элементов пользовательского интерфейса для включения этих функций.
Состояние загрузки
DataView имеет свойство загрузки, при включении которого отображается значок счетчика, показывающий загрузку данных. Необязательное свойство loadingIcon может быть передано в случае, если вам нужен другой значок загрузки.
Dataview
product.name product.description product.category $ product.price product.inventoryStatus product.category product.inventoryStatus product.name product.description $ product.price
<p-dataView
#dv
[value]="products"
[paginator]="true"
[rows]="9"
filterBy="name"
[sortField]="sortField"
[sortOrder]="sortOrder"
class="dataview-demo"
>
<ng-template pTemplate="header">
<div class="p-d-flex p-flex-column p-flex-md-row p-jc-md-between">
<p-dropdown
[options]="sortOptions"
[(ngModel)]="sortKey"
placeholder="Sort By Price"
(onChange)="onSortChange($event)"
styleClass="p-mb-2 p-mb-md-0"
></p-dropdown>
<span class="p-input-icon-left p-mb-2 p-mb-md-0">
<i class="pi pi-search"></i>
<input type="search" pInputText placeholder="Search by Name" (input)="dv.filter($event.target.value)" />
</span>
<p-dataViewLayoutOptions></p-dataViewLayoutOptions>
</div>
</ng-template>
<ng-template let-product pTemplate="listItem">
<div class="p-col-12">
<div class="product-list-item">
<div class="product-list-detail">
<div class="product-name">{ { product.name } }</div>
<div class="product-description">{ { product.description } }</div>
<p-rating [ngModel]="product.rating" [readonly]="true" [cancel]="false"></p-rating>
<i class="pi pi-tag product-category-icon"></i><span class="product-category">{ { product.category } }</span>
</div>
<div class="product-list-action">
<span class="product-price">${ { product.price } }</span>
<p-button icon="pi pi-shopping-cart" label="Add to Cart" [disabled]="product.inventoryStatus === "OUTOFSTOCK""></p-button>
<span [class]=""product-badge status-" + product.inventoryStatus.toLowerCase()">{ { product.inventoryStatus } }</span>
</div>
</div>
</div>
</ng-template>
<ng-template let-product pTemplate="gridItem">
<div class="p-col-12 p-md-4">
<div class="product-grid-item card">
<div class="product-grid-item-top">
<div>
<i class="pi pi-tag product-category-icon"></i>
<span class="product-category">{ { product.category } }</span>
</div>
<span [class]=""product-badge status-" + product.inventoryStatus.toLowerCase()">{ { product.inventoryStatus } }</span>
</div>
<div class="product-grid-item-content">
<div class="product-name">{ { product.name } }</div>
<div class="product-description">{ { product.description } }</div>
<p-rating [ngModel]="product.rating" [readonly]="true" [cancel]="false"></p-rating>
</div>
<div class="product-grid-item-bottom">
<span class="product-price">${ { product.price } }</span>
<p-button icon="pi pi-shopping-cart" [disabled]="product.inventoryStatus === "OUTOFSTOCK""></p-button>
</div>
</div>
</div>
</ng-template>
</p-dataView>
Свойства
Name | Type | Default | Description |
---|---|---|---|
value | array | null | An array of objects to display. |
layout | string | list | Layout of the items, valid values are "list" and "grid". |
paginator | boolean | false | When specified as true, enables the pagination. |
rows | number | null | Number of rows to display per page. |
totalRecords | number | null | Number of total records, defaults to length of value when not defined. |
pageLinks | number | 5 | Number of page links to display in paginator. |
rowsPerPageOptions | array | null | Array of integer/object values to display inside rows per page dropdown of paginator |
paginatorPosition | string | bottom | Position of the paginator, options are "top","bottom" or "both". |
alwaysShowPaginator | boolean | true | Whether to show it even there is only one page. |
showFirstLastIcon | boolean | true | When enabled, icons are displayed on paginator to go first and last page. |
paginatorDropdownAppendTo | any | null | Target element to attach the paginator dropdown overlay, valid values are "body" or a local ng-template variable of another element (note: use binding with brackets for template variables, e.g. [appendTo]="mydiv" for a div element having #mydiv as variable name). |
paginatorDropdownScrollHeight | string | 200px | Paginator dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value. |
currentPageReportTemplate | string | (currentPage of totalPages) | Template of the current page report element. Available placeholders are currentPage,totalPages,rows,first,last and totalRecords |
showCurrentPageReport | boolean | false | Whether to display current page report. |
showJumpToPageDropdown | boolean | false | Whether to display a dropdown to navigate to any page. |
showPageLinks | boolean | true | Whether to show page links. |
lazy | boolean | false | Defines if data is loaded and interacted with in lazy manner. |
emptyMessage | string | No records found. | Text to display when there is no data. Defaults to global value in i18n translation configuration. |
style | string | null | Inline style of the component. |
styleClass | string | null | Style class of the component. |
trackBy | Function | null | Function to optimize the dom operations by delegating to ngForTrackBy, default algoritm checks for object identity. |
filterBy | string | null | Comma separated list of fields in the object graph to search against. |
filterLocale | string | undefined | Locale to use in filtering. The default locale is the host environment's current locale. |
loading | boolean | false | Displays a loader to indicate data load is in progress. |
loadingIcon | string | pi pi-spinner | The icon to show while indicating data load is in progress. |
first | number | 0 | Index of the first row to be displayed. |
События
Name | Parameters | Description |
---|---|---|
onLazyLoad | event.first = First row offset<br>event.rows = Number of rows per page<br> | Callback to invoke when paging, sorting or filtering happens in lazy mode. |
onPage | event.first: Index of first record in page<br>event.rows: Number of rows on the page | Callback to invoke when pagination occurs. |
onSort | event.sortField: Name of the sort field.<br>event.sortOrder: Order of the sort. | Callback to invoke when sorting occurs. |
onChangeLayout | event.layout: New layout | Callback to invoke when changing layout. |
Шаблоны
Name | Parameters |
---|---|
header | - |
paginatorLeft | - |
paginatorRight | - |
gridItem | $implicit: Data of the grid<br>index: Index of the grid |
listItemTemplate | $implicit: Data of the row<br>index: Index of the row |
empty | - |
footer | - |
Стилизация
Name | Element |
---|---|
p-dataview | Container element. |
p-dataview-list | Container element in list layout. |
p-dataview-grid | Container element in grid layout. |
p-dataview-header | Header section. |
p-dataview-footer | Footer section. |
p-dataview-content | Container of items. |
p-dataview-emptymessage | Empty message element. |