Para sumar los valores de precio de las filas seleccionadas y mostrar el total en la vista con Angular 17, puedes modificar el componente que hemos creado anteriormente. Aquí tienes los pasos detallados para implementar esta funcionalidad:
Paso 1: Configurar el Componente
Genera el componente si aún no lo has hecho:
bashng generate component table-selectionDefine el modelo de datos y la lógica en el archivo TypeScript del componente:
typescriptimport { Component } from '@angular/core'; interface TableRow { id: number; name: string; price: number; } @Component({ selector: 'app-table-selection', templateUrl: './table-selection.component.html', styleUrls: ['./table-selection.component.css'] }) export class TableSelectionComponent { rows: TableRow[] = [ { id: 1, name: 'Item 1', price: 100 }, { id: 2, name: 'Item 2', price: 200 }, { id: 3, name: 'Item 3', price: 150 }, { id: 4, name: 'Item 4', price: 250 }, ]; selectedItems: Map<number, TableRow> = new Map<number, TableRow>(); toggleSelection(row: TableRow): void { if (this.selectedItems.has(row.id)) { this.selectedItems.delete(row.id); } else { this.selectedItems.set(row.id, row); } } isSelected(id: number): boolean { return this.selectedItems.has(id); } getTotalPrice(): number { let total = 0; this.selectedItems.forEach(item => { total += item.price; }); return total; } }En este código:
- Usamos un
Map<number, TableRow>para manejar los elementos seleccionados, evitando duplicaciones. - La función
toggleSelectionañade o elimina un objetoTableRowdelMapdependiendo de si ya está seleccionado. - La función
isSelectedverifica si un ID está en elMap. - La función
getTotalPricecalcula la suma de los precios de los elementos seleccionados.
- Usamos un
Paso 2: Implementar la Plantilla HTML
En el archivo table-selection.component.html, define la tabla y utiliza un evento click para manejar la selección de filas con checkboxes. Muestra el total de los precios seleccionados.
html<div>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Price</th>
<th>Select</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let row of rows" [class.selected]="isSelected(row.id)">
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.price }}</td>
<td>
<input
type="checkbox"
(change)="toggleSelection(row)"
[checked]="isSelected(row.id)">
</td>
</tr>
</tbody>
</table>
<h3>Selected Items:</h3>
<ul>
<li *ngFor="let item of selectedItems.values()">
ID: {{ item.id }}, Price: {{ item.price }}
</li>
</ul>
<h3>Total Price: {{ getTotalPrice() }}</h3>
</div>
- Usamos
[class.selected]="isSelected(row.id)"para aplicar un estilo CSS a las filas seleccionadas. - La propiedad
[checked]="isSelected(row.id)"asegura que los checkboxes reflejen correctamente la selección. - Utilizamos
*ngForpara iterar sobre los valores delMapy mostrar los IDs y precios de los elementos seleccionados. - Mostramos el total de los precios seleccionados usando
{{ getTotalPrice() }}.
Paso 3: Agregar Estilos CSS
En el archivo table-selection.component.css, define los estilos para las filas seleccionadas y la tabla.
csstable {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
tr.selected {
background-color: #e0f7fa; /* Cambia el color para que se ajuste a tu diseño */
}
input[type="checkbox"] {
cursor: pointer;
}
Paso 4: Agregar el Componente en la Aplicación
Asegúrate de que el componente se use en la aplicación principal. Abre el archivo app.component.html y añade:
html<app-table-selection></app-table-selection>
Resumen
Este enfoque permite seleccionar varias filas en una tabla usando checkboxes, evita selecciones repetidas mediante el uso de un Map, y aplica estilos CSS a las filas seleccionadas. La función toggleSelection maneja la lógica para agregar o quitar objetos TableRow del Map, mientras que isSelected se utiliza para determinar si una fila está seleccionada y aplicar el estilo adecuado. Además, los IDs y precios de las filas seleccionadas se muestran en la vista utilizando un *ngFor sobre los valores del Map, y el total de los precios seleccionados se calcula y se muestra en la vista.
No hay comentarios:
Publicar un comentario
Gracias por su mensaje, en breve le atenderemos.