Угловое изменение цвета строки при нажатии кнопки

#html #css #angular #typescript

Вопрос:

В моем коде у меня есть длинный список элементов и кнопка для боковой панели. Поскольку список слишком длинный, я хочу запомнить, где я нажал. Для этого я хочу, чтобы цвет строки менялся при нажатии кнопки. Вот что я сделал до сих пор. Мне удалось изменить только цвет всей таблицы (строка пула). Что я должен сделать, чтобы изменить цвет только выбранной строки?

HTML:

 lt;div fxLayout="column" fxLayoutAlign="end" class="mat-elevation-z4 responsive-grid"gt;  lt;div fxLayout="row" fxLayoutAlign="end" class="pr-4"gt;  lt;mat-form-field fxFlex fxFlex.gt-sm="30"gt;  lt;input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filtrele"gt;  lt;/mat-form-fieldgt;  lt;/divgt;  lt;table mat-table [dataSource]="dataSource" matSort class="stock-table" id="pool-row"gt;  lt;ng-container matColumnDef="Reference"gt;  lt;th mat-header-cell *matHeaderCellDef mat-sort-headergt;  Belge No lt;/thgt;  lt;td mat-cell *matCellDef="let row; let i = index"gt;  lt;p *ngIf="controlReferanceColor(row)" style="color:red;"gt;{{row.Reference}}  lt;/pgt;  lt;p *ngIf="!controlReferanceColor(row)"gt;{{row.Reference}}lt;/pgt;  lt;/tdgt;  lt;/ng-containergt;  lt;ng-container matColumnDef="Actions"gt;  lt;th mat-header-cell *matHeaderCellDefgt;lt;/thgt;  lt;td mat-cell *matCellDef="let row"gt;  lt;a mat-icon-button matTooltip="Detay" *ngIf="row.SourceType?.Id != 32"  [routerLink]="getLink(row)" target="_blank"gt;  lt;mat-icongt;open_in_browserlt;/mat-icongt;  lt;/agt;  lt;button mat-icon-button matTooltip="Liste" *ngIf="row.SourceType?.Id == 32" id="list"  class="sidebar-toggle" (click)="getReferenceList('lab-test-detail-preview',row)"gt;  lt;mat-icongt;pageviewlt;/mat-icongt;  lt;/buttongt;  lt;/tdgt;  lt;/ng-containergt;   lt;tr mat-header-row *matHeaderRowDef="displayedColumns"gt;lt;/trgt;  lt;tr mat-row *matRowDef="let row; columns: displayedColumns;"  [ngClass]="{'amber-fg': controlReferanceColor(row) == true}"gt;lt;/trgt;  lt;/tablegt;  lt;/divgt;  

тс:

 getReferenceList(sidebarName: string, reference: IProcess) {  if (reference amp;amp; reference.Reference != "") {  this.selectedProcessList = this._stockService.processList.find(  (x) =gt; x.Reference === reference.Reference  ).ChildProcessList;  this._fuseSidebarService.getSidebar(sidebarName).open();  }  document.getElementById('pool-row').style.backgroundColor = '#fced49'; }  

Ответ №1:

Я бы сказал, что все, что вам нужно сделать, это передать свой индекс ngFor в функцию click:

 (click)="getReferenceList('lab-test-detail-preview',row, i)"  

В функции вы сохраняете его в поле компонента

 getReferenceList(sidebarName: string, reference: IProcess, index: number) {  this.currentRow = index;  // ... }  

А затем примените стиль (например, применив класс css) в своем шаблоне

 lt;tr mat-row   *matRowDef="let row; columns: displayedColumns;"  [class.red]="currentRow === i"gt;lt;/trgt;  

Комментарии:

1. Спасибо, но это не сработало :/

2. currentRow должен быть объявлен как переменная в вашем компоненте. Возможно, вам следует предоставить пример кода на stackblitz, потому что я думаю, что Stackoverflow существует не для отладки вашего приложения с помощью комментариев, а для ответов на вопросы 😉

Ответ №2:

Как сказал Анди-Ио, передайте индекс getReferenceList и установите свойство.

 currentRow: number = -1; // or currentRow: number | null = null; // or currentRow: number | undefined = undefined;  getReferenceList(sidebarName: string, reference: IProcess, index: number) {  this.currentRow = index;  // ... }  

(Удалите строку с document.getElementById помощью . Вы всегда хотите напрямую манипулировать dom, только если это невозможно в противном случае.)

Затем в шаблоне измените нижнюю строку следующим образом:

 lt;tr mat-row *matRowDef="let row; let i = index; columns: displayedColumns;"  [ngClass]="{'amber-fg': controlReferanceColor(row) == true, 'cur-row': i === currentRow}"gt;lt;/trgt;  

Примечание: Вам нужно снова захватить индекс.

Объявите соответствующий класс в своем файле scss/css.

Комментарии:

1. У меня нет currentRow собственности, где я должен ее декларировать?

2. В классе typescript (где getReferenceList находится).

3. Снова не сработало. Теперь весь список отображается желтым цветом при первом открытии страницы. И я не нажал на кнопку строки.

4. Не знаю, почему мой ответ в основном копируется и вставляется вами @GunnarB.

5. @Andi-lo Ваш ответ отсутствует, по крайней мере let i = index , в шаблоне, а также уже используется ngClass , поэтому вы можете добавить его вместо использования class.X . Я также указываю, что вы не должны напрямую манипулировать dom.