Сортування за замовчуванням у кутовому матеріалі - Заголовок сортування


85

Як я можу змінити код Angular Material нижче, щоб таблиця даних була відсортована за стовпчиком "name", за зростанням за зростанням. Стрілка (із зазначенням поточного напрямку сортування) повинна відображатися.

Це те, чого я хочу досягти:

введіть тут опис зображення

Оригінальний код:

<table matSort (matSortChange)="sortData($event)">
  <tr>
    <th mat-sort-header="name">Dessert (100g)</th>
    <th mat-sort-header="calories">Calories</th>
    <th mat-sort-header="fat">Fat (g)</th>
    <th mat-sort-header="carbs">Carbs (g)</th>
    <th mat-sort-header="protein">Protein (g)</th>
  </tr>

  <tr *ngFor="let dessert of sortedData">
    <td>{{dessert.name}}</td>
    <td>{{dessert.calories}}</td>
    <td>{{dessert.fat}}</td>
    <td>{{dessert.carbs}}</td>
    <td>{{dessert.protein}}</td>
  </tr>
</table>

Я намагався щось подібне, але це не працює (стрілка не відображається, не сортується)

<table matSort (matSortChange)="sortData($event)" matSortActive="name" matSortStart="asc" matSortDisableClear>

Ось посилання на Plunker


Могли зателефонувати this.sortData({active: "name", direction: "asc"})на ngOnInitчек plunker
Pankaj Parkar

1
@PankajParkar Неправильне рішення. Таблиця відсортовано, але заголовок Сортування про це не знає, і стрілка (що вказує поточний напрямок сортування) не відображається.
Jacek Kościesza

Відповіді:


134

Ви помиляєтесь matSortStartіз matSortDirection.

Спробуйте це:

<table matSort (matSortChange)="sortData($event)" matSortActive="name" matSortDirection="asc" matSortDisableClear>

https://plnkr.co/edit/sg0hC5d8LTjLKhbH9Eug?p=preview

matSortStart може використовуватися для звороту циклу, який використовується при сортуванні (наприклад, коли користувач натискає кнопку сортування, вона починається з desc замість asc).


4
Цей метод працює лише вперше. Після того, як джерело даних таблиці було змінено, я намагаюся заново встановити matSortActiveі, matSortDirectionале маленька стрілка не відображається
Гіл Епштейн

Зразок, здається, вже не працює, я зробив новий: stackblitz.com/edit/angular-defaultsort?file=src/app/…
Бен,

45

Ви можете програмно відсортувати таблицю, викликаючи sort(Sortable)метод джерела даних. Припускаючи, що у вас є dataSourceвластивість компонента для джерела даних:

// to put next to the class fields of the component
@ViewChild(MatSort) sort: MatSort

// to put where you want the sort to be programmatically triggered, for example inside ngOnInit
this.sort.sort(({ id: 'name', start: 'asc'}) as MatSortable);
this.dataSource.sort = this.sort;

1
Це щось на кшталт того, що я шукаю, але єдина проблема - це ініціює matSortChangeподію. Чи є спосіб встановити сортування, не запускаючи подію?
rain01

Ні. Так відбувається виклик сортування. Чому ви не хочете, щоб спрацьовувала подія matSortChange?
Ніно

1
тому що у мене встановлено оновлення файлу cookie з asc/ descз стовпця, і якщо він викликається кожного разу, коли завантажується сторінка, то кожного разу це буде по-іншому
rain01,

16
@ViewChild(MatSort) sort: MatSort;

this.dataSource.sort = this.sort;

const sortState: Sort = {active: 'name', direction: 'desc'};
this.sort.active = sortState.active;
this.sort.direction = sortState.direction;
this.sort.sortChange.emit(sortState);

повинен працювати. демо

А щоб показати стрілку напрямку сортування, додайте наступний css (обхідний шлях)

th.mat-header-cell .mat-sort-header-container.mat-sort-header-sorted .mat-sort-header-arrow {
    opacity: 1 !important;
    transform: translateY(0) !important;
}

2
Будь ласка, надайте деякі пояснення разом із вашим кодом, щоб пізніше користувач міг легше слідувати вашим ідеям / коду.
HansHirse

1
Я використав тут сортування від Nino та обхід CSS, щоб отримати моє програмно встановлене сортування для відображення стрілки.
bts

У кутовій 7 я просто встановив this.sort = {active: 'name', direction: 'desc'}; і мені не довелося додавати жодних змін CSS, щоб стрілка була активною.
Нік

Нік Галлімор, можливо, ви додаєте свій css не в потрібному місці? спробуйте додати його в головний глобальний файл css (це може бути в активі / css / ... css)
Аман Мадіярбеков

10

Оновлення для матеріалу (перевірено за допомогою v7.3):

@ViewChild(MatSort) matSort: MatSort;

private someMethod(): void {
  this.matSort.sort({ id: 'columnName', start: 'asc', disableClear: false });
}

Це також оновить mat-sort-headerстрілку 'без будь-яких обхідних шляхів


2

Ви також можете прив'язати властивості сортування таблиці mat до своєї змінної компонента.

Як каже @Andrew Seguin:

<table matSort matSortActive="name" matSortDirection="asc">

Це правильний спосіб встановити сортування за замовчуванням, якщо ви знаєте, що це таке.

У випадку, якщо ви отримуєте сортування звідки-небудь ще (у моєму випадку із параметрів рядка запиту), ви можете зробити це так (тут стрілки для сортування чудово працюють тут):

sortDirection: 'name',  // this can be changed or filled in any time
sortProperty: 'asc',


<mat-table matSort [matSortActive]="sortProperty" [matSortDirection]="sortDirection">

1

Можливо, ви намагалися викликати на ініціюванні сторінки функцію сортування, нав'язану імені та напрямку?

     ngOnInit() {
    let defSort: Sort = {};
    defSort.direction = 'asc';
    defSort.active = 'name';
    this.sortData(defSort);
  }

5
Це не правильне рішення. Таблиця відсортована, але заголовок сортування про це не знає, і стрілка (із зазначенням поточного напрямку сортування) не відображається
Jacek Kościesza

1

У моєму випадку сортування не працювало, оскільки ідентифікатор matColumDef та var-комірки mat відрізняються

<ng-container matColumnDef="firstName">
   <th mat-header-cell *matHeaderCellDef mat-sort-header class="mat-table-header">First Name</th>
  <td mat-cell *matCellDef="let item"> {{ item.name}}</td>
</ng-container>

після внесення змін matColumnDef = "firstName" на matColumnDef = " name ", що збігається з елементом. ім'я

    <ng-container matColumnDef="name">
   <th mat-header-cell *matHeaderCellDef mat-sort-header class="mat-table-header">First Name</th>
  <td mat-cell *matCellDef="let item"> {{ item.name}}</td>
</ng-container>

у мене це прекрасно працює


0

Мені довелося зробити стандартне сортування при завантаженні

const matSort = { id: defaultSort.name } as MatSortable;
this.sort.direction = defaultSort.sort === 'asc' ? '' : defaultSort.sort === 'desc' ? 'asc' : 'desc' as SortDirection;
this.sort.sort(matSort);

0

Відповідь від @Andrew Seguin (перша та прийнята відповідь) зробила для мене візуальну хитрість, але таблиці не відсортувала .

Моє рішення - використати html-код, наданий @Andrew Seguin, і сам викликати метод sortData (sort: Sort) , але як це зробити? Як зазначено в документації , `` Сортувати '' - це інтерфейс, який має дві властивості, активну та напрям, і інтерфейс повинен виглядати приблизно так:

export interface Sort {
   active:string //The id/name of the column being sorted
   direction:string //asc or dsc depending on the use case (The sort direction)
}

Тож фокус полягає у виклику методу sortData (sort: Sort) у ngOnInit наступним чином:

ngOnInit(){
    //Do some nitialization
    this.sortData({active:'name', direction:'asc'});
}

sortData(sort: Sort) {
    //Your sorting algorithm (see examples in documentation, link above and at the bottom)
}

HTML-код такий, як у прийнятій відповіді ;-) Сподіваюся, це допомагає комусь, Алекс

Приклади документації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.