Здесь, в моей таблице матов, есть 6 столбцов, когда в любом столбце не больше слов, тогда он выглядит как Изображение-1, но когда в любом столбце больше слов, тогда пользовательский интерфейс выглядит как Изображение-2, поэтому как установить пользовательский интерфейс, как Изображение-1, когда любой В столбце есть больше слов в угловом 6?
Изображение-1
Изображение-2
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>






используя css, мы можем настроить конкретную ширину столбца, которую я ввел в код ниже.
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;
}
Вы должны указать, в какой селектор вы добавляете эти классы
@Nick: вы не собираетесь добавлять ни к одному селектору таблицы данных. Просто назовите свой селектор css таким же, как имя, которое вы дали вашему matColumnDef в вашем файле .html.
@ BashirM.Saad Спасибо, это упрощает задачу, особенно селекторы предопределены и нет необходимости добавлять собственные селекторы. Работает именно так, как показано.
почему !important? По возможности избегайте этой директивы, так как без нее она работает нормально.
Если вы используете scss для своих стилей, вы можете использовать миксин, чтобы помочь сгенерировать код. Ваши стили быстро выйдут из-под контроля, если каждый раз выставлять все свойства.
Это очень простой пример - на самом деле не более чем доказательство концепции, вы можете расширить его с помощью нескольких свойств и правил по мере необходимости.
@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');
}
}
}
}
}
Затем в вашем компоненте, где определена ваша таблица, вы просто делаете это:
@include mat-table-columns((
orderid: (width: 6rem, color: gray),
date: (width: 9rem),
items: (width: 20rem)
));
Это генерирует что-то вроде этого:
.mat-column-orderid[_ngcontent-c15] {
flex: 6rem;
min-width: 6rem;
color: gray; }
.mat-column-date[_ngcontent-c15] {
flex: 9rem;
min-width: 9rem; }
В этой версии width становится flex: value; min-width: value.
Для вашего конкретного примера вы можете добавить wrap: true или что-то в этом роде в качестве нового параметра.
Когда-то кто-то проголосовал за меня за это :-) Я нашел этот способ очень полезным - и вы можете расширять его все, что хотите, по мере необходимости, чтобы быть более согласованным между компонентами.
Примечание. Вы, конечно, можете использовать пиксели, если хотите. Я обычно предпочитаю ems, когда задействованы текстовые данные, и я использую здесь rems, потому что, когда размер шрифта заголовка и ячейки отличается, они будут искажены, поскольку по определению em зависят от размера шрифта.
Это выглядит супер шикарно, но я не понимаю, куда положить миксин ...
как импортировать $columns в мат-таблицу ??
@SridharNatuva, вы не импортируете $ columns, это просто имя переменной в определенном миксине (найдите sass-миксины). Когда вы используете миксин с @include, туда вы помещаете значение для $ columns (в моем примере выше @include mat-table-columns(( вторая скобка - это начало значения $ columns, которое представляет собой структуру данных sass, представляющую каждый именованный столбец)
мы можем добавить атрибут ширина прямо в th
например:
<ng-container matColumnDef = "position" >
<th mat-header-cell *matHeaderCellDef width = "20%"> No. </th>
<td mat-cell *matCellDef = "let element"> {{element.position}} </td>
</ng-container>
На данный момент использование ширины в теге TH не рекомендуется.
Чтобы добавить к бумажному следу, официальные документы подтверждают это: <th>
Вот альтернативный способ решения проблемы:
Вместо того, чтобы пытаться «исправить это в публикации», почему бы вам не обрезать описание до того, как таблица попытается уместить его в свои столбцы? У меня так получилось:
<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>
Поэтому я сначала проверяю, больше ли массив определенной длины, если да, то усекаю и добавляю «...», в противном случае передаю значение как есть. Это позволяет нам по-прежнему пользоваться автоматическим интервалом в таблице :)
Лучшее решение для меня, так как я также хотел обрезать данные. В других решениях, если вы просто указываете ширину столбца, высота строки увеличивается по мере того, как данные вырастают за пределы ширины
Как я реализовал, и он работает нормально. вам просто нужно добавить ширину столбца с помощью matColumnDef = "description"
Например :
<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>
здесь matColumnDefproductId, productName и action
теперь применяем ширину по matColumnDef
укладка
.mat-column-productId {
flex: 0 0 10%;
}
.mat-column-productName {
flex: 0 0 50%;
}
а оставшаяся ширина одинаково распределяется между другими столбцами
Думаю, это лучший ответ. Это мне действительно помогло. Какое-то время искал решение. Спасибо!
он работает, просто убедитесь, что вы правильно назвали свой класс css, например .mat-column-xxx, где xxx может чем угодно
Вы легко можете это сделать. В каждом столбце вы получите класс с именем поля с префиксом mat-column, поэтому класс будет похож на mat-column-yourFieldName. Для этого вы можете установить стиль, как показано ниже
.mat-column-yourFieldName {
flex: none;
width: 100px;
}
Таким образом, мы можем указать фиксированную ширину столбца в соответствии с нашим требованием.
Надеюсь, это кому-то поможет.
У меня это сработало, спасибо. что, если бы я хотел избежать повторения flex: none; для каждого столбца? скажем, класс .mat-column-* { flex: none; }, который я пробовал, но это не сработало.
Просто нужно обновить ширину тега th.
th {
width: 100px;
}
Это, безусловно, самый простой способ подать заявку, большое спасибо!
Просто добавьте style = "width:5% !important;" в th и тд
<ng-container matColumnDef = "username">
<th style = "width:5% !important;" mat-header-cell *matHeaderCellDef> Full Name </th>
<td style = "width:5% !important;" mat-cell *matCellDef = "let element"> {{element.username}} ( {{element.usertype}} )</td>
</ng-container>
В !important нет необходимости.
Просто добавьте класс full-width-table в таблицу тегов.
например
<table mat-table class = "full-width-table" [dataSource] = "dataSource">
Вы можете использовать атрибут fixedLayout = "true", например <table #table mat-table [dataSource] = "dataSource" fixedLayout = "true">
fixedLayout: использовать ли фиксированный макет таблицы. Включение этой опции обеспечит согласованную ширину столбцов и оптимизирует отображение липких стилей для собственных таблиц. Не работает для гибких столов.
введите описание изображения здесьI имел таблицу с четырьмя столбцами. Смотрите скриншот. В scss-файле я включил следующий код:
.full-width-table {
width: 100%;
}
.mat-column-id {
width: 15% !important;
}
.mat-column-question {
width: 55% !important;
}
.mat-column-view {
width: 15% !important;
}
.mat-column-reply {
width: 15% !important;
}
Это ответ?
Это сработало для меня. Вы можете проверить прикрепленное изображение
Это должно быть отмечено как ответ - не знаю, почему он не получает голосов.
@AlanObject, потому что вы никогда не должны использовать! Important в стилях, это плохая практика
Если вы хотите задать фиксированную ширину для определенного столбца, вы можете добавить fxFlex = "60px" как в mat-cell, так и в mat-header-cell.
Речь идет о
mat-table, а не оtable[mat-table]. Это не работает дляmat-table(шлейф). material.angular.io/components/table/overview