J'ai un projet Angular 7. Et j'ai écrit et il envoie mes rowData . Quand j'ai écrit un ng-template comme ci-dessous, tout fonctionnait parfaitement. Mais, j'ai besoin de plusieurs ng-template. J'ai essayé quelque chose comme ci-dessous. Mais je ne pouvais pas exécuter. Comment puis-je y parvenir?
app.grid.component.html
<app-grid>
<ng-template let-rowData="rowData" [ngForTemplate]="templateRef">
<button type="button" label="Delete" (click)="delete(rowData)"></button>
</ng-template>
<ng-template let-rowData="rowData" [ngForTemplate]="templateRef2">
<button type="button" label="Update" (click)="update(rowData)"></button>
</ng-template>
</app-grid>
export class GridComponent implements OnInit {
@ContentChild(TemplateRef) templateRef: TemplateRef<any>;
@ContentChild(TemplateRef) templateRef2: TemplateRef<any>;
}
<ng-template pTemplate="body" let-rowData>
<tr>
<td *ngFor="let col of Columns" class="ui-resizable-column">
<span>{{rowData[col.field]}}</span>
</td>
<td>
<ng-template *ngTemplateOutlet="templateRef; context : {rowData : rowData}"></ng-template>
</td>
<td>
<ng-template *ngTemplateOutlet="templateRef2; context : {rowData : rowData}"></ng-template>
</td>
</tr>
</ng-template>
app.grid.component.html p >
<app-grid>
<ng-template let-rowData="rowData">
<button type="button" label="Update" (click)="update(rowData)"
</ng-template>
</app-grid>
app.grid.component.ts
export class GridComponent implements OnInit {
@ContentChild(TemplateRef) templateRef: TemplateRef<any>;
}
moncomposant.html strong >
<ng-template pTemplate="body" let-rowData>
<tr>
<td *ngFor="let col of Columns" class="ui-resizable-column">
<span>{{rowData[col.field]}}</span>
</td>
<td>
<ng-template *ngTemplateOutlet="templateRef; context : {rowData : rowData}"></ng-template>
</td>
</tr>
</ng-template>
3 Réponses :
Vous devez utiliser @ContentChildren au lieu de @ContentChild
@ContentChildren(TemplateRef) tabs: QueryList<TemplateRef>;
Mais, comment je peux donner un identifiant à templateRef, si j'utilise List comme vous l'avez dit. En d'autres termes, à quel point angulaire sait quel ngtemplate écrit dans quel ngtemplate. @BearNithi.
Mais, comment je peux donner un identifiant à templateRef. en d'autres termes, comment angulaire sait quel ngtemplate écrit dans quel ngtemplat @BearNithi.
Vous pouvez y faire une boucle.
J'ajoute votre code à mon app.grid.component.ts à mon code de travail. Et j'ai changé app.grid.component.html en . Ma console donnant l'erreur templateRef.createEmbeddedView n'est pas une fonction . Et mes colonnes sont vides. @BearNithi
Hasan Ozdemir, vous pouvez utiliser @ViewChild pour cela,
Component.ts
créez des modèles avec
TemplateRefpuis sélectionnez la variable de modèle dans le composant à afficher,
<td>
<ng-container *ngTemplateOutlet="template1; context : {rowData : rowData}"></ng-container>
</td>
<td>
<ng-container *ngTemplateOutlet="template2; context : {rowData : rowData}"></ng-container>
</td>
Modifiez votre modèle ci-dessous si vous souhaitez afficher plusieurs modèles à la fois, utilisez @ ViewChildren au lieu de MISE À JOUR: vous devez définir le modèle sur selectedTemplate que vous souhaitez afficher.
Mais je pense que vous devez afficher plusieurs modèles, alors apportez quelques modifications à votre fichier html. Vous pouvez donc supprimer
<ng-container *ngTemplateOutlet="selectedTemplate; context : {rowData : rowData}"></ng-container>
<app-grid>
<ng-template #template1>
<button type="button" label="Delete" (click)="delete(rowData)"></button>
</ng-template>
<ng-template #template2>
<button type="button" label="Update" (click)="update(rowData)"></button>
</ng-template>
</app-grid>
@ViewChild . J'espère que cela vous donnera quelque chose à comprendre sur ngTemplates :) selectedTemplate de votre composant. @ViewChild("template1") template1: TemplateRef<any>;
@ViewChild("template2") template2: TemplateRef<any>;
selectedTemplate: TemplateRef<any>;
Merci @ ganesh045. Je change mes codes comme tu l'as dit. Ma console ne donne aucune erreur. Mais mes colonnes sont vides. J'ai écrit myComponent.html comme ceci. Est-ce vrai? {{rowData [col.field]}} td>
J'ai essayé mais ça n'a pas marché. Les colonnes sont à nouveau vides @ ganesh045
utilisez ng-container au lieu de ng-template cela fonctionnera @Hasan Ozdemir, la réponse a été mise à jour avec ng-container :)
Cela n'a pas fonctionné :) @ ganesh045. Les colonnes sont à nouveau vides
y a-t-il une raison de mettre vos modèles dans ..? Si non, supprimez-le une fois et essayez-le
Oui. C'est requis. Parce que je gère toutes les grilles de mon application à partir d'un seul composant. @ ganesh045
J'ai trouvé la réponse. Vous pouvez voir à partir de ce lien stackblitz. (Ce stackblitz n'est pas exactement le même. Mais la logique est exactement la même.)
y a-t-il une erreur dans votre console?
Ma console donne Impossible de se lier à 'ngForTemplate' car ce n'est pas une propriété connue de 'ng-template' @BearNithi