Sắp xếp mặc định trong Angular Material - Tiêu đề sắp xếp


85

Làm cách nào để thay đổi mã Angular Material bên dưới, để bảng dữ liệu được sắp xếp theo cột 'tên', thứ tự tăng dần theo mặc định. Mũi tên (cho biết hướng sắp xếp hiện tại) phải được hiển thị.

Đây là những gì tôi muốn đạt được:

nhập mô tả hình ảnh ở đây

Mã gốc:

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

Tôi đã thử một cái gì đó như thế này, nhưng nó không hoạt động (không có mũi tên hiển thị, không được sắp xếp)

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

Đây là liên kết đến Plunker


Có thể gọi this.sortData({active: "name", direction: "asc"})về ngOnInitkiểm tra plunker
Pankaj Parkar

1
@PankajParkar Đây không phải là giải pháp chính xác. Bảng được sắp xếp, nhưng tiêu đề Sắp xếp không biết về nó và mũi tên (cho biết hướng sắp xếp hiện tại) không được hiển thị.
Jacek Kościesza

Câu trả lời:


134

Bạn đang nhầm matSortStartvới matSortDirection.

Thử đi:

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

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

matSortStart có thể được sử dụng để đảo ngược chu trình được sử dụng khi sắp xếp (ví dụ: khi người dùng nhấp vào để sắp xếp, nó bắt đầu tại desc thay vì asc).


4
Phương pháp này chỉ hoạt động lần đầu tiên. Sau khi dữ liệu của bảng được thay đổi, tôi cố gắng thiết lập lại matSortActivematSortDirectionnhưng mũi tên nhỏ không hiển thị
Gil Epshtain

Mẫu có vẻ không hoạt động nữa, tôi đã tạo một mẫu mới: stackblitz.com/edit/angular-defaultsort?file=src/app/…
Ben

45

Bạn có thể sắp xếp bảng theo chương trình bằng cách gọi sort(Sortable)phương thức của nguồn dữ liệu. Giả sử bạn có thuộc tính dataSourcethành phần cho nguồn dữ liệu:

// 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
Đây là loại mà tôi đang tìm kiếm nhưng vấn đề duy nhất là nó kích hoạt matSortChangesự kiện. Có cách nào để đặt sắp xếp mà không kích hoạt sự kiện không?
rain01

Không. Đó là cách loại được gọi. Tại sao bạn không muốn sự kiện matSortChange được kích hoạt?
Nino Filiu

1
bởi vì tôi có nó thiết lập để cập nhật một cookie với asc/ desccủa một cột và nếu nó được gọi là mỗi trang thời gian được nạp sau đó mỗi lần nó sẽ khác nhau
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);

nên làm việc. bản giới thiệu

Và để hiển thị mũi tên hướng sắp xếp, hãy thêm css tiếp theo (giải pháp thay thế)

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

2
Vui lòng cung cấp một số giải thích cùng với mã của bạn, để người dùng sau này có thể làm theo ý tưởng / mã của bạn dễ dàng hơn.
HansHirse

1
Tôi đã sử dụng sắp xếp từ Nino và giải pháp CSS ở đây để sắp xếp theo lập trình của tôi để hiển thị mũi tên.
bts

Trong góc 7, tôi chỉ đặt this.sort = {active: 'name', direction: 'desc'}; và tôi không phải thêm bất kỳ thay đổi CSS nào để mũi tên hoạt động.
Nick Gallimore

Nick Gallimore có thể bạn đang thêm css của mình không đúng vị trí? cố gắng thêm nó vào một file css toàn cầu chính (nó có thể nằm trong tài sản / css / ... css)
Aman Madiiarbekov

10

Cập nhật cho Vật liệu (được thử nghiệm với v7.3):

@ViewChild(MatSort) matSort: MatSort;

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

Điều này cũng sẽ cập nhật mat-sort-headermũi tên của mà không có bất kỳ giải pháp nào


2

Bạn cũng có thể liên kết thuộc tính sắp xếp bảng mat với biến thành phần của mình.

Như @Andrew Seguin nói:

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

Đây là cách thích hợp để đặt sắp xếp mặc định nếu bạn biết cái nào là cái đó.

Trong trường hợp bạn sắp xếp từ một nơi khác (trong trường hợp của tôi là từ các tham số chuỗi truy vấn), bạn cũng có thể làm như thế này (các mũi tên sắp xếp hoạt động hoàn hảo ở đây):

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


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

1

Có thể bạn đã cố gắng gọi trên init của trang hàm sắp xếp bắt buộc về tên và hướng chưa?

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

5
Đó không phải là giải pháp chính xác. Bảng được sắp xếp, nhưng Sắp xếp tiêu đề không biết về nó và mũi tên (chỉ hướng sắp xếp hiện tại) không được hiển thị
Jacek Kościesza

1

Trong trường hợp của tôi, sắp xếp không hoạt động vì id matColumDef và mat-cell var khác nhau

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

sau khi thực hiện thay đổi matColumnDef = "firstName" thành matColumnDef = " name " giống với mục. Tên

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

Việc này ổn với tôi


0

Tôi đã phải sắp xếp mặc định khi tải

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

Câu trả lời từ @Andrew Seguin (câu trả lời đầu tiên và được chấp nhận) đã đánh lừa thị giác đối với tôi, nhưng nó không sắp xếp được bảng.

Giải pháp của tôi là sử dụng mã html được cung cấp bởi @Andrew Seguin và tự mình gọi phương thức sortData (sort: Sắp xếp) , nhưng làm thế nào để thực hiện điều đó? Như được chỉ định trong tài liệu , '' Sắp xếp '' là một giao diện có hai thuộc tính, hoạt động và hướng và giao diện phải trông giống như vậy:

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)
}

Vì vậy, mẹo là gọi phương thức sortData (sort: Sắp xếp) trong ngOnInit như sau:

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)
}

Mã HTML giống như trong câu trả lời được chấp nhận ;-) Hy vọng điều này sẽ giúp ích cho mọi người, Alex

Các ví dụ về tài liệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.