J'ai un ngFor pour les lignes et je fais quoi quand je clique sur une cellule pour la rendre modifiable
<tr *ngFor="let invoice of invoiceItem.rows">
<td contenteditable='true' (input)="onRowClick($event, invoice.rowId)">{{ invoice.rowName }}</td>
<td>{{ invoice.hours}}</td>
<td>{{ invoice.price }}</td>
<td>{{ invoice.comments }}</td>
<td>{{ invoice.total}} </td>
</tr>
plus sur ce que je supporter avec de nouvelles lignes ajoutées
<button (click)='addRow()'>Add a row</button>
addRow() {
this.invoiceItem.rows.Push({
invoiceDetailsId: this.invoiceItem.item.invoiceId,
rowName: '',
hours: 0,
price: 0,
comments: '',
total: 0,
rowId:
})
}
onRowClick(event, id) {
console.log(event.target.outerText, id);
}
que dois-je mettre en œuvre pour cette tâche?
Voici une solution qui fonctionne. Ce n'est peut-être pas joli, mais ça marche.
Changez la structure de votre table en quelque chose comme ceci:
<tr *ngFor="let invoice of invoiceItem.rows">
<td *ngIf="invoice.rowId == editRowId">
<input type="text" [(ngModel)]="invoice.hours">
</td>
<td *ngIf="invoice.rowId !== editRowId" (click)="toggle(invoice.rowId)">
{{invoice.rowId}}
</td>
<!-- the rest of your fields in same manner -->
</tr>
Et dans votre composant:
editRowId: any;
toggle(id){
this.editRowId = id;
}
Cela prend également en charge l’ajout d’une nouvelle ligne. Je suis venu avec un bidouillage pour définir l'identifiant pour la nouvelle ligne, comme suit:
addRow() {
let indexForId = this.invoiceItem.rows.length + 1
this.rows.Push({
// .....
rowId: indexForId,
})
}
Vous pourriez trouver un meilleur moyen :)
Voici un travailplunker
ok, vous allez d’abord ajouter une propriété supplémentaire pour chaque invoice
appelée editable: false
, puis lors de la lecture en boucle de la liste, vous lierez des données comme ceci;
[contenteditable]="invoice.editable"
faire ceci pour tout td
<td (input)="onRowClick($event, invoice.rowId)">
<div [contenteditable]="invoice.editable ? 'true': 'false'">{{ invoice.rowName }}</div>
</td>