Donc, la question est assez simple ...
J'ai une table et un peu de logique angular dessus (calcul des styles, etc.) ... spécifiquement, je l'ai sur les TH
[class.hidden] = "column.group !== 'key-data' && currentTableView !== column.group"
Pour ma fonctionnalité d'en-têtes collants de table, je dois cloner la table et la positionner fixe. À l'aide d'une directive, qui fait quelque chose comme ça (simplifié)
let newTable = element.cloneNode(true);
body.appendChild(newTable);
évidemment la logique angular n'est pas appliquée au newTable, mais je veux que ce soit ...
Comment fait-on ça?
J'ai donc fait quelques recherches et c'est ce que j'ai trouvé.
Vous pouvez le faire et ce n'est pas si difficile d'utiliser des modèles et le [ngTemplateOutlet]
. Voilà comment cela fonctionne:
@Component({
selector: 'my-app',
template: `
<template #temp>
<h1 [ngStyle]="{background: 'green'}">Test</h1>
<p *ngIf="bla">Im not visible</p>
</template>
<template [ngTemplateOutlet]="temp"></template>
<template [ngTemplateOutlet]="temp"></template>
`
})
export class AppComponent {
bla: boolean = false;
@ContentChild('temp') testEl: any;
}
Vous créez donc un modèle de référence, ajoutez toute votre logique à l'intérieur de celui-ci, puis vous créez simplement autant de copies du modèle à l'aide de [ngTemplateOutlet]
. Toutes les liaisons internes et la fonctionnalité angular sont conservées.
Voici un plongeur qui travaille:
http://plnkr.co/edit/jPt5eKUfLUe9FxnLH8bL?p=preview
Comme vous pouvez le voir, je l'ai testé avec *ngIf
et [ngStyle]
et ils fonctionnent comme prévu et je ne vois aucune raison pour laquelle aucun autre type de directive ne fonctionnerait.
Vous pouvez même utiliser *ngFor
mais vous devez ensuite fournir le [ngOutletContext]
. Je l'ai fait dans une bibliothèque sur laquelle je travaille, vous pouvez voir un exemple ici:
https://github.com/flauc/ng2-simple-components/blob/master/src/select/select.component.ts