Компоненты PrimeNG
DataView

Витрина

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>

Свойства

NameTypeDefaultDescription
valuearraynullAn array of objects to display.
layoutstringlistLayout of the items, valid values are "list" and "grid".
paginatorbooleanfalseWhen specified as true, enables the pagination.
rowsnumbernullNumber of rows to display per page.
totalRecordsnumbernullNumber of total records, defaults to length of value when not defined.
pageLinksnumber5Number of page links to display in paginator.
rowsPerPageOptionsarraynullArray of integer/object values to display inside rows per page dropdown of paginator
paginatorPositionstringbottomPosition of the paginator, options are "top","bottom" or "both".
alwaysShowPaginatorbooleantrueWhether to show it even there is only one page.
showFirstLastIconbooleantrueWhen enabled, icons are displayed on paginator to go first and last page.
paginatorDropdownAppendToanynullTarget 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).
paginatorDropdownScrollHeightstring200pxPaginator dropdown height of the viewport in pixels, a scrollbar is defined if height of list exceeds this value.
currentPageReportTemplatestring(currentPage of totalPages)Template of the current page report element. Available placeholders are currentPage,totalPages,rows,first,last and totalRecords
showCurrentPageReportbooleanfalseWhether to display current page report.
showJumpToPageDropdownbooleanfalseWhether to display a dropdown to navigate to any page.
showPageLinksbooleantrueWhether to show page links.
lazybooleanfalseDefines if data is loaded and interacted with in lazy manner.
emptyMessagestringNo records found.Text to display when there is no data. Defaults to global value in i18n translation configuration.
stylestringnullInline style of the component.
styleClassstringnullStyle class of the component.
trackByFunctionnullFunction to optimize the dom operations by delegating to ngForTrackBy, default algoritm checks for object identity.
filterBystringnullComma separated list of fields in the object graph to search against.
filterLocalestringundefinedLocale to use in filtering. The default locale is the host environment's current locale.
loadingbooleanfalseDisplays a loader to indicate data load is in progress.
loadingIconstringpi pi-spinnerThe icon to show while indicating data load is in progress.
firstnumber0Index of the first row to be displayed.

События

NameParametersDescription
onLazyLoadevent.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.
onPageevent.first: Index of first record in page<br>event.rows: Number of rows on the pageCallback to invoke when pagination occurs.
onSortevent.sortField: Name of the sort field.<br>event.sortOrder: Order of the sort.Callback to invoke when sorting occurs.
onChangeLayoutevent.layout: New layoutCallback to invoke when changing layout.

Шаблоны

NameParameters
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-

Стилизация

NameElement
p-dataviewContainer element.
p-dataview-listContainer element in list layout.
p-dataview-gridContainer element in grid layout.
p-dataview-headerHeader section.
p-dataview-footerFooter section.
p-dataview-contentContainer of items.
p-dataview-emptymessageEmpty message element.