Я использую таблицы Angular Material 7 (mat-table). Я хочу получить ссылку на всю строку, чтобы отобразить страницу с подробностями.
Требуется показать реальная ссылка, который можно открыть в новой вкладке, поэтому обычное событие (щелчок) не работает.
Мне удалось добавить ссылку вокруг содержимого каждой ячейки мата, но, поскольку у меня много столбцов, это не лучшее решение.
Есть ли хороший способ преобразовать каждый мат-ряд в ссылку (href)?
Обновлено: я удалил свой пример, так как правильный ответ был дан ниже.





Вы можете добавить строку, как определено в Документы по материалам Angular. Таким образом, вы можете добавить [routerLink] ко всей строке, а не к отдельным ячейкам.
Добавить routerLink к мат-ряд
<mat-row *matRowDef = "let row; columns: displayedColumns;" [routerLink] = "'transaction/' + row.id" class = "row-hover"></mat-row>
ИЛИ
Вы можете добавить событие клика и собственный класс css в мат-ряд:
<mat-row *matRowDef = "let row; columns: displayedColumns;"
(click) = "navigateTo(row)" class = "row-hover"></mat-row>
затем в файле .ts:
import { Router } from '@angular/router';
...
...
constructor(private router: Router) {}
...
navigateTo(row: any) {
this.router.navigate(['/maintenance/data/'+row.id]);
}
И добавьте класс css
.row-link:hover {
background-color: rgba(0, 0, 0, .05);
cursor: pointer;
}
Спасибо, но это еще не настоящая ссылка. Я попытался создать директиву-оболочку, но поскольку matRowDef уже является директивой, это стало очень сложно.
Доступно Никто этих решений. Нужно разрешить открывать ссылку в новой вкладке или копировать URL-адрес, щелкнув правой кнопкой мыши. Однако с этим решением это невозможно. Также невозможно открыть ссылку, выделив ее с помощью клавиатуры и нажав Enter. Это плохая практика.
rounterLink следует объявить так: [routerLink] = "'transaction/' + row.id" иначе он не будет работать
также убедитесь, что модуль, в котором вы находитесь, импортировал RouterModule, чтобы routerLink работал должным образом.
Что ж, вы можете проделать классический трюк с пустым тегом а по всей строке. Просто поместите тег в только один ng-контейнеров и дайте ему настраиваемое правило css:
<mat-table [dataSource] = "dataSource" matSort class = "mat-elevation-z8">
<ng-container matColumnDef = "name">
<mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
<mat-cell *matCellDef = "let element">
{{element.name}}
<a fxFlexFill [routerLink] = "'/maintenance/data/'+element.id" class = "mat-row-link"></a>
</mat-cell>
</ng-container>
<ng-container matColumnDef = "lastname">
<mat-header-cell *matHeaderCellDef>Last Name</mat-header-cell>
<mat-cell *matCellDef = "let element">
{{element.lastname}}
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef = "displayedColumns"></mat-header-row>
<mat-row *matRowDef = "let row; columns: displayedColumns;"></mat-row>
</mat-table>
Затем на CSS:
.mat-row{
position: relative;
}
.mat-row-link{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
Просто помните, что пустой тег а сделает работу, но не соответствует всем стандартам SEO ...
Спасибо большое, работает! Я поместил CSS в нашу глобальную таблицу стилей, так что это хорошее решение для нас :-)
Обновлено: проблема с этим решением заключается в том, что данные строки больше не могут быть отмечены (для копирования-вставки данных): - /
Это кажется хорошим способом, но, к сожалению, у меня он не работает. Я добавил текст (чтобы увидеть, куда идет позиция), и когда я это делаю, я вижу текст вверху области просмотра, а не в строке. Каким-то образом позиция: относительная не применяется к .mat-row и ограничивает область действия страницы. Никакой другой позиции не вижу: относительные звенья цепи тоже.
@RickStrahl то же самое для меня. вы нашли решение для этого?
Кажется, это покрывает всю таблицу, а не только строку
Вы можете заключить всю строку в a-тег и добавить к нему routerLink. С этим решением вы получите встроенную обработку ссылок. Я использую cdk-table, но полагаю, что это также должно работать для таблицы материалов angular.
Мое решение выглядит следующим образом:
<cdk-table [dataSource] = "data">
...
<a *cdkRowDef = "let row; columns; columns" [routerLink] = "['path', row.id]">
<cdk-row></cdk-row>
</a>
</cdk-table>
Я перешел с "mat-table" на "table-mat-table", чтобы попробовать вашу ссылку. Использование только [routerLink] делает строки доступными для кликов, но браузер не распознает это как настоящие ссылки. Мне пришлось бы как-то обернуть строки тегом «а».