Wie stelle ich die Breite der Mat-Table-Säule im Winkel ein?


77

Hier in meiner Mat-Tabelle gibt es 6 Spalten, wenn eine Spalte nicht mehr Wörter enthält als Image-1, aber wenn eine Spalte mehr Wörter enthält, sieht die Benutzeroberfläche wie Image-2 aus. So stellen Sie die Benutzeroberfläche wie Image-1 ein, falls vorhanden Spalte hat mehr Wörter in Winkel 6?

Bild-1

Geben Sie hier die Bildbeschreibung ein

Bild-2

Geben Sie hier die Bildbeschreibung ein

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>


Überprüfen Sie dieses Tutorial auf Tricks zur
Code Spy

Antworten:


98

Mit CSS können wir die spezifische Spaltenbreite anpassen, die ich unter dem Code eingefügt habe.

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
Sie sollten hinzufügen, zu welchem ​​Selektor Sie diese Klassen hinzufügen
Nick Gallimore

2
@Nick: Sie werden keinem Selektor der Datentabelle hinzufügen. Benennen Sie einfach Ihren CSS-Selektor so, dass er mit dem Namen übereinstimmt, den Sie Ihrem matColumnDef in Ihrer HTML-Datei gegeben haben
Bashir M. Saad

1
@ BashirM.Saad Danke, dies erleichtert die Arbeit, insbesondere die Selektoren sind vordefiniert und es müssen keine benutzerdefinierten Selektoren hinzugefügt werden. Es funktioniert genau wie gezeigt.
Rahul Sonwanshi

58

Wenn Sie scss für Ihre Stile verwenden, können Sie ein Mixin verwenden, um den Code zu generieren. Ihre Stile geraten schnell außer Kontrolle, wenn Sie jedes Mal alle Eigenschaften festlegen.

Dies ist ein sehr einfaches Beispiel - eigentlich nichts anderes als ein Proof of Concept. Sie können dies bei Bedarf um mehrere Eigenschaften und Regeln erweitern.

@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');
                }
            }  
        }
    }
}

Dann tun Sie in Ihrer Komponente, in der Ihre Tabelle definiert ist, einfach Folgendes:

@include mat-table-columns((

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

));

Dies erzeugt ungefähr so:

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

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

In dieser Version widthwird flex: value; min-width: value.

Für Ihr spezielles Beispiel könnten Sie wrap: trueoder so etwas als neuen Parameter hinzufügen .


Mit der Zeit hat mich jemand dafür positiv bewertet :-) Ich fand diesen Weg sehr hilfreich - und Sie können ihn nach Bedarf erweitern, um konsistenter über alle Komponenten hinweg zu sein.
Simon_Weaver

1
Hinweis: Sie können natürlich auch Pixel verwenden, wenn Sie dies bevorzugen. Im Allgemeinen bevorzuge ich ems, wenn es sich um Textdaten handelt, und ich verwende hier rems, da sie bei unterschiedlichen Schriftgrößen für Header und Zellen verzerrt sind, da 'em' per Definition je nach Schriftgröße variieren.
Simon_Weaver

1
Das sieht super schick aus, aber ich bin mir nicht sicher, wo ich das Mixin platzieren soll ...
Gus

1
Wie importiere $columnsich in Mat-Table?
Sridhar Natuva

29

Wie ich implementiert habe, und es funktioniert gut. Sie müssen nur die Spaltenbreite mit hinzufügenmatColumnDef="description"

zum Beispiel :

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

hier matColumnDefist productId, productNameundaction

jetzt wenden wir width by an matColumnDef

Styling

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

und die verbleibende Breite wird gleichermaßen anderen Spalten zugewiesen



13

Sie können dies leicht tun. In jeder Spalte erhalten Sie eine Klasse mit dem Feldnamen, dem mat-column vorangestellt ist, sodass die Klasse wie mat-column-yourFieldName ist. Dazu können Sie den Stil wie folgt einstellen

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

So können wir eine feste Breite für die Säule gemäß unserer Anforderung angeben.

Hoffe das hilft jemandem.


7

Hier ist eine alternative Möglichkeit, das Problem anzugehen:

Warum versuchen Sie nicht, die Beschreibung abzuschneiden, bevor die Tabelle versuchen muss, sie in ihre Spalten einzupassen, anstatt zu versuchen, sie in der Post zu reparieren? Ich habe es so gemacht:

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

Also überprüfe ich zuerst, ob das Array größer als eine bestimmte Länge ist, wenn ja, dann schneide ich ab und füge '...' hinzu, andernfalls übergebe ich den Wert wie er ist. Dies ermöglicht es uns, immer noch von dem automatischen Abstand zu profitieren, den die Tabelle bietet :)

Geben Sie hier die Bildbeschreibung ein


Die beste Lösung für mich, da ich auch Daten abschneiden wollte. In anderen Lösungen wird die
Lernender

2

wir können Attribut hinzufügen Breite direkt auf th

z.B:

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

6
Ab sofort ist die Breite für die Verwendung auf dem TH-Tag veraltet.
Carl Sare

Nur um die Papierspur zu ergänzen, bestätigen die offiziellen Dokumente dies: <th>
Dane Brouwer

1

Sie müssen nur die Breite des thTags aktualisieren .

th {
  width: 100px;
}

das funktionierte überraschenderweise auch.
Han K
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.