У меня есть таблица, в которой пользователь может выбрать два варианта: удалить или сохранить. В заголовке первого столбца у меня есть кнопка удалить все и сохранить все переключатели, которые будут выбирать каждую строку в dataSource
. Я хочу, чтобы он выбирал только те строки, которые отображаются на текущей странице, а не все dataSource
. Размер пагинатора сейчас равен 5, но в конечном итоге он изменится.
StackBlitz: https://stackblitz.com/edit/angular-qkx3pc
Вот мой HTML код:
<mat-drawer-container>
<mat-drawer-content>
<div class="tbl-container">
<mat-progress-bar mode="query" color="accent" *ngIf="isLoading" mode="indeterminate"></mat-progress-bar>
<table matSort mat-table [dataSource]="dataSource">
<ng-container matColumnDef="header-row-first-group">
<th mat-header-cell *matHeaderCellDef [style.text-align]="center" [attr.colspan]="2">
Review Response
</th>
</ng-container>
<ng-container matColumnDef="review">
<mat-header-cell fxFlex="230px" *matHeaderCellDef>
<mat-radio-button class="retain" (click)="retainAll()" style="padding-right: 5%;" [value]="0"
>Retain All</mat-radio-button
>
<mat-radio-button class="remove" (click)="removeAll()" [value]="1" color="warn"
>Remove All</mat-radio-button
>
</mat-header-cell>
<mat-cell fxFlex="230px" *matCellDef="let item" (click)="$event.stopPropagation()">
<mat-radio-group [value]="item.review">
<mat-radio-button
class="retain"
[checked]="retain.checked"
(change)="retain.checked = !retain.checked"
[value]="0"
>Retain</mat-radio-button
>
<mat-radio-button
class="remove"
[checked]="remove.checked"
(change)="retain.checked = !retain.checked"
style="margin-left: 20px;"
color="warn"
[value]="1"
>Remove</mat-radio-button
>
</mat-radio-group>
</mat-cell>
</ng-container>
<ng-container matColumnDef="mots_id">
<mat-header-cell *matHeaderCellDef mat-sort-header>Mots ID</mat-header-cell>
<mat-cell *matCellDef="let item">{{ item.mots_id }}</mat-cell>
</ng-container>
<ng-container matColumnDef="completed">
<mat-header-cell *matHeaderCellDef mat-sort-header>Completed</mat-header-cell>
<mat-cell *matCellDef="let item">{{ item.completed }}</mat-cell>
</ng-container>
...
<tr mat-header-row *matHeaderRowDef="['header-row-first-group']"></tr>
<mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="tbl-header"></mat-header-row>
<mat-row
*matRowDef="let row; columns: displayedColumns"
(click)="helpdrawer.open(); selectedRow(row); highlight(row)"
[ngClass]="{ highlight: selectedRowIndex == row.uid }"
></mat-row>
</table>
...
</div>
...
</mat-drawer-content>
...
</mat-drawer-container>
Вот мой код TS:
class Component {
@ViewChild(MatPaginator) gridPaginator: MatPaginator;
@ViewChild(MatSort) gridSort: MatSort;
@ViewChild('ref') ref: any;
gridSettings = [
{ primaryKey: 'review', header: 'Review Response', render: 'both' },
{ primaryKey: 'mots_id', header: 'MOTS ID', render: 'both' },
{ primaryKey: 'app', header: 'App', render: 'both' },
{ primaryKey: 'env', header: 'Environment', render: 'both' },
{ primaryKey: 'profile', header: 'Profile', render: 'both' },
{ primaryKey: 'account_id', header: 'Account ID', render: 'both' },
{ primaryKey: 'owner_id', header: 'Owner ID', render: 'both' },
{ primaryKey: 'ccdr_read_only', header: 'Read Only', render: 'both' },
{ primaryKey: 'sec_layer', header: 'Security Layer', render: 'both' },
{ primaryKey: 'sec_image_id', header: 'Security Image ID', render: 'both' },
{ primaryKey: 'instance', header: 'Instance', render: 'both' },
{ primaryKey: 'data_source', header: 'DataSource', render: 'both' },
{ primaryKey: 'spi', header: 'SPI', render: 'both' },
{ primaryKey: 'mots_sox_indicator', header: 'SOX', render: 'both' },
];
dataSource = new MatTableDataSource<any>();
selection = new SelectionModel<any>(true, []);
displayedColumns = this.gridSettings.filter(a => a.render != 'export').map(b => b.primaryKey);
retain = {
checked: false,
};
remove = {
checked: false,
};
constructor(
private cdRef: ChangeDetectorRef,
private accessReviewDataService: AccessReviewDataService,
private userService: UserService,
public dialog: MatDialog,
) {
this.currentUser = this.userService.currentUser();
}
ngAfterContentInit() {
// init sort
this.gridSort.sort({ id: 'mots_id', start: 'desc', disableClear: false });
this.dataSource.sort = this.gridSort;
// init paging
this.dataSource.paginator = this.gridPaginator;
//this.cdRef.detach();
this.subscriptions.add(
this.accessReviewDataService.getAccessReview(this.currentUser.user_id).subscribe(
results => {
this.dataSource.data = results;
this.addId(results);
this.isLoading = false;
},
error => (this.isLoading = false),
),
);
}
retainAll() {
this.remove.checked = false;
this.retain.checked = true;
}
removeAll() {
this.retain.checked = false;
this.remove.checked = true;
}
}
Прямо сейчас он выбирает каждую строку в таблице, я только хочу, чтобы он выбирал строки, отображаемые на странице. Любая помощь / направление будет оценено. Спасибо!