Làm thế nào để đặt chiều rộng của cột mat-table theo góc?


85

Ở đây trong bảng mat-xa của tôi có 6 cột khi cột nào không có nhiều từ hơn thì nó sẽ giống như Hình ảnh-1, nhưng khi cột nào có nhiều từ hơn thì giao diện người dùng sẽ giống như Hình ảnh-2, vậy làm thế nào để đặt giao diện người dùng như Hình ảnh-1 khi bất kỳ cột có nhiều chữ hơn ở góc 6?

Hình ảnh-1

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

Hình ảnh-2

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

user.component.html

<div class="mat-elevation-z8">      
 <table mat-table [dataSource]="dataSource">
  <ng-container matColumnDef="userimage">
    <th mat-header-cell *matHeaderCellDef> # </th>
    <td mat-cell *matCellDef="let element"> 
      <img src="{{commonUrlObj.commonUrl}}/images/{{element.userimage}}" style="height: 40px;width: 40px;"/>
    </td>
  </ng-container>

  <ng-container matColumnDef="username">
    <th mat-header-cell *matHeaderCellDef> Full Name </th>
    <td mat-cell *matCellDef="let element"> {{element.username}} ( {{element.usertype}} )</td>
  </ng-container>

  <ng-container matColumnDef="emailid">
    <th mat-header-cell *matHeaderCellDef> EmailId </th>
    <td mat-cell *matCellDef="let element"> {{element.emailid}} </td>
   </ng-container>

  <ng-container matColumnDef="contactno">
    <th mat-header-cell *matHeaderCellDef> Contact No. </th>
    <td mat-cell *matCellDef="let element"> {{element.contactno}} </td>
  </ng-container>

  <ng-container matColumnDef="enabled">
    <th mat-header-cell *matHeaderCellDef> Enabled </th>
    <td mat-cell *matCellDef="let element" style="color: blue">
      <ng-container *ngIf="element.enabled == 'true'; else otherss">Enabled</ng-container>
        <ng-template #otherss>Disabled</ng-template>
    </td>
  </ng-container>

  <ng-container matColumnDef="action">
    <th mat-header-cell *matHeaderCellDef> Action </th>
      <td mat-cell *matCellDef="let element" fxLayoutGap="5px">
        <button mat-mini-fab color="primary" routerLink="/base/editUserDetails/{{element.userid}}"><mat-icon>edit</mat-icon></button>
        <button mat-mini-fab color="primary" routerLink="/base/viewUserDetails/{{element.userid}}"><mat-icon>pageview</mat-icon></button>
      </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [pageSizeOptions]="[5, 10, 20, 50 ,100]" showFirstLastButtons></mat-paginator>


Kiểm tra hướng dẫn này trên góc Chất liệu Bảng Column width thủ đoạn tùy freakyjolly.com/...
Mã Spy

Câu trả lời:


102

bằng cách sử dụng css, chúng tôi có thể điều chỉnh độ rộng cột cụ thể mà tôi đưa vào mã bên dưới.

user.component.css

table{
 width: 100%;
}

.mat-column-username {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 28% !important;
  width: 28% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-emailid {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 25% !important;
  width: 25% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-contactno {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 17% !important;
  width: 17% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-userimage {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 8% !important;
  width: 8% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

.mat-column-userActivity {
  word-wrap: break-word !important;
  white-space: unset !important;
  flex: 0 0 10% !important;
  width: 10% !important;
  overflow-wrap: break-word;
  word-wrap: break-word;

  word-break: break-word;

  -ms-hyphens: auto;
  -moz-hyphens: auto;
  -webkit-hyphens: auto;
  hyphens: auto;
}

7
Bạn nên thêm mà chọn bạn thêm các lớp này để
Nick Gallimore

2
@Nick: Bạn sẽ không thêm vào bất kỳ bộ chọn nào của bảng dữ liệu. Chỉ cần đặt tên selector css của bạn để được giống như tên của bạn đã matColumnDef của bạn trong file .html của bạn
Bashir M. Saad

1
@ BashirM.Saad Cảm ơn điều này làm cho mọi thứ dễ dàng hơn, đặc biệt là các bộ chọn được xác định trước và không cần thêm bộ chọn tùy chỉnh. Nó hoạt động chính xác như được hiển thị.
Rahul Sonwanshi

tại sao !important? Tránh chỉ thị này càng nhiều càng tốt vì không có tác dụng tốt.
Saad Benbouzid

60

Nếu bạn đang sử dụng scss cho các kiểu của mình, bạn có thể sử dụng mixin để giúp tạo mã. Phong cách của bạn sẽ nhanh chóng vượt khỏi tầm tay nếu bạn đặt tất cả các thuộc tính mọi lúc.

Đây là một ví dụ rất đơn giản - thực sự không hơn gì một bằng chứng về khái niệm, bạn có thể mở rộng điều này với nhiều thuộc tính và quy tắc nếu cần.

@mixin mat-table-columns($columns)
{
    .mat-column-
    {
        @each $colName, $props in $columns {

            $width: map-get($props, 'width');

            &#{$colName} 
            {
                flex: $width;
                min-width: $width;

                @if map-has-key($props, 'color') 
                {
                    color: map-get($props, 'color');
                }
            }  
        }
    }
}

Sau đó, trong thành phần của bạn nơi bảng của bạn được xác định, bạn chỉ cần thực hiện điều này:

@include mat-table-columns((

    orderid: (width: 6rem, color: gray),
    date: (width: 9rem),
    items: (width: 20rem)

));

Điều này tạo ra một cái gì đó như thế này:

.mat-column-orderid[_ngcontent-c15] {
  flex: 6rem;
  min-width: 6rem;
  color: gray; }

.mat-column-date[_ngcontent-c15] {
  flex: 9rem;
  min-width: 9rem; }

Trong phiên bản này widthtrở thành flex: value; min-width: value.

Đối với ví dụ cụ thể của bạn, bạn có thể thêm wrap: truehoặc một cái gì đó tương tự như một tham số mới.


Khoảng thời gian ai đó ủng hộ tôi vì điều này :-) Tôi thấy cách này rất hữu ích - và bạn có thể mở rộng nó nếu cần để nhất quán hơn giữa các thành phần.
Simon_Weaver

1
Lưu ý: Tất nhiên bạn có thể sử dụng pixel nếu muốn. Tôi thường thích ems hơn khi dữ liệu văn bản có liên quan và tôi đang sử dụng rems ở đây vì khi kích thước phông chữ tiêu đề và ô khác nhau, chúng sẽ bị lệch vì theo định nghĩa 'em' thay đổi theo kích thước phông chữ.
Simon_Weaver

1
Cái này trông siêu gai góc, nhưng tôi không rõ nên đặt hỗn hợp ở đâu ...
Gus

1
làm thế nào để nhập $columnstrong mat-table ??
Sridhar Natuva

38

Như tôi đã triển khai, và nó đang hoạt động tốt. bạn chỉ cần thêm chiều rộng cột bằng cách sử dụngmatColumnDef="description"

ví dụ :

<mat-table #table [dataSource]="dataSource" matSortDisableClear>
    <ng-container matColumnDef="productId">
        <mat-header-cell *matHeaderCellDef>product ID</mat-header-cell>
        <mat-cell *matCellDef="let product">{{product.id}}</mat-cell>
    </ng-container>
    <ng-container matColumnDef="productName">
        <mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
        <mat-cell *matCellDef="let product">{{product.name}}</mat-cell>
    </ng-container>
    <ng-container matColumnDef="actions">
        <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>
        <mat-cell *matCellDef="let product">
            <button (click)="view(product)">
                <mat-icon>visibility</mat-icon>
            </button>
        </mat-cell>
    </ng-container>
    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns"></mat-row>
</mat-table>

đây matColumnDefproductId, productNameaction

bây giờ chúng tôi áp dụng chiều rộng bằng matColumnDef

phong cách

.mat-column-productId {
    flex: 0 0 10%;
}
.mat-column-productName {
    flex: 0 0 50%;
}

và chiều rộng còn lại được phân bổ đều cho các cột khác


1
Tôi nghĩ đây là câu trả lời tốt nhất. Điều này thực sự đã giúp tôi. Đã tìm kiếm giải pháp trong một thời gian. Cảm ơn bạn!
Kruno


21

Bạn có thể dễ dàng làm điều này. Trong mỗi cột, bạn sẽ nhận được một lớp với tên trường được bắt đầu bằng mat-column, vì vậy lớp sẽ giống như mat-column-yourFieldName. Vì vậy, bạn có thể thiết lập kiểu như sau

.mat-column-yourFieldName {
    flex: none;
    width: 100px;
}

Vì vậy, chúng tôi có thể cung cấp chiều rộng cố định cho cột theo yêu cầu của chúng tôi.

Hy vọng điều này sẽ giúp ích cho ai đó.


7

Đây là một cách khác để giải quyết vấn đề:

Thay vì cố gắng "sửa nó trong bài viết", tại sao bạn không cắt bớt mô tả trước khi bảng cần thử và lắp nó vào các cột của nó? Tôi đã làm nó như thế này:

<ng-container matColumnDef="description">
   <th mat-header-cell *matHeaderCellDef> {{ 'Parts.description' | translate }} </th>
            <td mat-cell *matCellDef="let element">
                {{(element.description.length > 80) ? ((element.description).slice(0, 80) + '...') : element.description}}
   </td>
</ng-container>

Vì vậy, trước tiên tôi kiểm tra xem mảng có lớn hơn một độ dài nhất định hay không, nếu Có thì hãy cắt bớt và thêm '...' nếu không thì chuyển giá trị như cũ. Điều này cho phép chúng tôi vẫn được hưởng lợi từ việc tự động giãn cách bảng :)

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


Giải pháp tốt nhất cho tôi vì tôi cũng muốn cắt bớt dữ liệu. Trong các giải pháp khác nếu u chỉ cung cấp độ rộng của cột chiều cao hàng được mở rộng như dữ liệu phát triển xa hơn chiều rộng
học

2

chúng ta có thể thêm chiều rộng thuộc tính trực tiếp vào th

ví dụ:

<ng-container matColumnDef="position" >
    <th mat-header-cell *matHeaderCellDef width ="20%"> No. </th>
    <td mat-cell *matCellDef="let element"> {{element.position}} </td>
  </ng-container>

8
Hiện tại, chiều rộng không được sử dụng trên thẻ TH.
Carl Sare

Chỉ cần để thêm vào các dấu vết giấy tờ, tài liệu chính thức xác nhận điều đó: <th>
Dane Brouwer

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.