J'ai une table avec des données affichées en utilisant ngFor. J'ai besoin d'afficher les données d'une ligne individuelle dans un modal sur clic. Je peux l'enregistrer dans la console en passant la ligne en tant qu'argument de clic mais je ne peux pas la passer dans le modal.
En supposant que les données de la table sont extraites d'un service et que le modal est une référence de modèle qui se trouve dans le même fichier composant que la table.
Voici un violon créé https://stackblitz.com/edit/angular-xr8ud5
J'ai utilisé angular 1.x et les données ont été transmises via la résolution. Je suis nouveau sur Angular et je n'ai jamais travaillé dans ngBootstrap.
Toute aide est appréciée. Merci
3 Réponses :
Vous pouvez créer une variable pour les données modales dans le composant: StackBlitz
Ou vous pouvez créer composant pour modal:
modal-basic.ts
export ModalComponent implements OnInit{ @Input() inputDataInModalComponent: any; ngOnInit() { console.log(inputDataInModalComponent); } }
modal.component.ts
openModal(dataToModal) { const modalRef = this.modalService.open(ModalComponent); modalRef.componentInstance.inputDataInModalComponent = dataToModal; modalRef.result.then(() => {}); }, () => {}); }
juste besoin de stocker la ligne sélectionnée dans une variable que nous pouvons ensuite afficher sur le HTML
dans votre stackblitz , remplacez modal-basic.html par:
import {Component} from '@angular/core'; import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; @Component({ selector: 'ngbd-modal-basic', templateUrl: './modal-basic.html' }) export class NgbdModalBasic { closeResult: string; table = [ { "id": 1, "first":"Mark", "last": "Otto", "handle": "@mdo" },{ "id": 2, "first":"Jacob", "last": "Thornton", "handle": "@fat" },{ "id": 3, "first":"Larry", "last": "the Bird", "handle": "@twitter" } ]; selectedRow; constructor(private modalService: NgbModal) {} open(content, tableRow) { this.modalService.open(content, {ariaLabelledBy: 'modal-basic-title'}); //console.log(tableRow) this.selectedRow = {id:tableRow.id, first: tableRow.first, last:tableRow.last, handle:tableRow.handle}; } }
dans votre stackblitz , modifiez modal-basic .ts être:
<table class="table"> <thead> <tr> <th scope="col">#</th> <th scope="col">First</th> <th scope="col">Last</th> <th scope="col">Handle</th> </tr> </thead> <tbody> <tr *ngFor="let tableRow of table" (click)="open(content, tableRow)"> <th scope="row">{{tableRow.id}}</th> <td>{{tableRow.first}}</td> <td>{{tableRow.last}}</td> <td>{{tableRow.handle}}</td> </tr> </tbody> </table> <ng-template #content let-modal> <div class="modal-header"> <h4 class="modal-title" id="modal-basic-title">Details</h4> <button type="button" class="close" aria-label="Close" (click)="modal.dismiss('Cross click')"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> id:<u>{{selectedRow.id}}</u><br> first:<u>{{selectedRow.first}}</u><br> last:<u>{{selectedRow.last}}</u><br> handle:<u>{{selectedRow.handle}}</u> </div> </ng-template> <hr> <pre>{{closeResult}}</pre>
La transmission des données de votre composant à ngBoostrap modal peut être effectuée via la liaison bidirectionnelle d'Angular . C'est en fait de la même manière que vous effectuez une liaison bidirectionnelle sur Angular 1.x!
J'ai fait un demo pour vous.
Tout d'abord, sur votre model-basic.ts, vous définissez votre modèle pour le modal. Ensuite, vous attribuez la propriété de modèle modalContent
avec les données de ligne de table.
<ng-template #content let-modal> <div class="modal-header"> <h4 class="modal-title" id="modal-basic-title">Details</h4> <button type="button" class="close" aria-label="Close" (click)="modal.dismiss('Cross click')"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> id: {{ modalContent.id }} <br> first: {{ modalContent.first }} <br> last: {{ modalContent.last }} <br> handle: {{ modalContent.handle }} </div> </ng-template>
Sur votre modal-basic.html, vous pouvez utiliser le {{ ...}} expression de modèle pour afficher les propriétés individuelles de votre modèle sur votre modal lui-même.
modalContent:undefined . . open(content, tableRow) { this.modalContent = tableRow this.modalService.open(content, {ariaLabelledBy: 'modal-basic-title'}); }
Merci beaucoup! ça fonctionne maintenant. Je devais juste enregistrer l'argument passé dans une variable dans .open () C'était aussi simple que ça
Cheers :) Heureux de vous aider!
Vérifiez si cette réponse vous aide - stackoverflow.com/questions/50431629/...