Угловой материал 7: ссылка для всего ряда

Я использую таблицы Angular Material 7 (mat-table). Я хочу получить ссылку на всю строку, чтобы отобразить страницу с подробностями.

Требуется показать реальная ссылка, который можно открыть в новой вкладке, поэтому обычное событие (щелчок) не работает.

Мне удалось добавить ссылку вокруг содержимого каждой ячейки мата, но, поскольку у меня много столбцов, это не лучшее решение.

Есть ли хороший способ преобразовать каждый мат-ряд в ссылку (href)?

Обновлено: я удалил свой пример, так как правильный ответ был дан ниже.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
9
0
19 351
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете добавить строку, как определено в Документы по материалам Angular. Таким образом, вы можете добавить [routerLink] ко всей строке, а не к отдельным ячейкам.

Я перешел с "mat-table" на "table-mat-table", чтобы попробовать вашу ссылку. Использование только [routerLink] делает строки доступными для кликов, но браузер не распознает это как настоящие ссылки. Мне пришлось бы как-то обернуть строки тегом «а».

Laess3r 13.12.2018 15:43

Добавить 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 уже является директивой, это стало очень сложно.

Laess3r 14.12.2018 09:31

Доступно Никто этих решений. Нужно разрешить открывать ссылку в новой вкладке или копировать URL-адрес, щелкнув правой кнопкой мыши. Однако с этим решением это невозможно. Также невозможно открыть ссылку, выделив ее с помощью клавиатуры и нажав Enter. Это плохая практика.

Aloso 31.03.2020 22:23

rounterLink следует объявить так: [routerLink] = "'transaction/' + row.id" иначе он не будет работать

Francisco Bueno 13.05.2020 16:28

также убедитесь, что модуль, в котором вы находитесь, импортировал RouterModule, чтобы routerLink работал должным образом.

SwissCoder 12.10.2021 22:30
Ответ принят как подходящий

Что ж, вы можете проделать классический трюк с пустым тегом а по всей строке. Просто поместите тег в только один 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 в нашу глобальную таблицу стилей, так что это хорошее решение для нас :-)

Laess3r 21.01.2019 13:08

Обновлено: проблема с этим решением заключается в том, что данные строки больше не могут быть отмечены (для копирования-вставки данных): - /

Laess3r 27.06.2019 14:08

Это кажется хорошим способом, но, к сожалению, у меня он не работает. Я добавил текст (чтобы увидеть, куда идет позиция), и когда я это делаю, я вижу текст вверху области просмотра, а не в строке. Каким-то образом позиция: относительная не применяется к .mat-row и ограничивает область действия страницы. Никакой другой позиции не вижу: относительные звенья цепи тоже.

Rick Strahl 09.11.2019 21:59

@RickStrahl то же самое для меня. вы нашли решение для этого?

Ishmeet 04.12.2019 06:34

Кажется, это покрывает всю таблицу, а не только строку

Matt Westlake 07.02.2021 04:46

Вы можете заключить всю строку в 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>

Другие вопросы по теме