J'ai du mal à trouver un moyen de le faire. Dans un composant parent, le modèle décrit a table
et son thead
élément, mais délègue le rendu du tbody
à un autre composant, comme ceci:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody *ngFor="let entry of getEntries()">
<my-result [entry]="entry"></my-result>
</tbody>
</table>
Chaque composant myResult rend sa propre tr
balise, essentiellement comme ceci:
<tr>
<td>{{ entry.name }}</td>
<td>{{ entry.time }}</td>
</tr>
La raison pour laquelle je ne mets pas cela directement dans le composant parent (en évitant le besoin d'un composant myResult) est que le composant myResult est en fait plus compliqué que celui indiqué ici, donc je veux mettre son comportement dans un composant et un fichier séparés.
Le DOM résultant semble mauvais. Je pense que c'est parce qu'il est invalide, car tbody
il ne peut contenir que des tr
éléments (voir MDN) , mais mon DOM généré (simplifié) est:
<table>
<thead>
<tr>
<th>Name</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<my-result>
<tr>
<td>Bob</td>
<td>128</td>
</tr>
</my-result>
</tbody>
<tbody>
<my-result>
<tr>
<td>Lisa</td>
<td>333</td>
</tr>
</my-result>
</tbody>
</table>
Existe-t-il un moyen d'obtenir le même rendu, mais sans la <my-result>
balise d' emballage , et tout en utilisant un composant pour être seul responsable du rendu d'une ligne de table?
Je l' ai regardé ng-content
, DynamicComponentLoader
la ViewContainerRef
, mais ils ne semblent pas fournir une solution à ce pour autant que je peux voir.
la source
Réponses:
Vous pouvez utiliser des sélecteurs d'attributs
puis utilisez-le comme
la source
[]
? Avez-vous ajouté le composant àdeclarations: [...]
un module? Si le composant est enregistré dans un module différent, avez-vous ajouté cet autre module auimports: [...]
module où vous souhaitez utiliser le composant?setAttribute
n'est pas mon code. Mais je l'ai compris, je devais utiliser la balise de premier niveau dans mon modèle comme balise pour mon composant au lieu de lang-container
nouvelle utilisation de travail est<ul smMenu class="nav navbar-nav" [submenus]="root?.Submenus" [title]="root?.Title"></ul>
<ul class="nav navbar-nav"> <li-navigation [navItems]="menuItems"></li-navigation> </ul>
j'ai utilisé ceci (après avoir changé li-navigation en un sélecteur d'attribut)<ul class="nav navbar-nav" li-navigation [navItems]="menuItems"></ul>
Vous avez besoin de "ViewContainerRef" et à l'intérieur du composant my-result, faites quelque chose comme ceci:
html:
ts:
la source
@ViewChild('template', {static: true}) template;
my-result
faut pouvoir créer de nouveauxmy-result
frères et sœurs. Alors, imaginez que vous ayez une hiérarchiemy-result
où chaque ligne peut avoir des lignes "enfants". Dans ce cas, l'utilisation d'un sélecteur d'attribut ne fonctionnerait pas, car le premier sélecteur va dans letbody
, mais le second ne peut pas aller dans un internetbody
ni dans untr
.Utilisez cette directive sur votre élément
Exemple d'utilisation:
et dans le html parent, vous appelez l'élément card comme d'habitude, par exemple:
La sortie sera:
la source
Les sélecteurs d'attributs sont le meilleur moyen de résoudre ce problème.
Donc dans votre cas:
mes-résultats ts
mes-résultats html
mon-résultat ts
my-result html
Voir stackblitz de travail: https://stackblitz.com/edit/angular-xbbegx
la source
vous pouvez essayer d'utiliser le nouveau css
display: contents
voici ma barre d'outils scss:
et le html:
et en cours d'utilisation:
la source
Une autre option de nos jours est la
ContribNgHostModule
mise à disposition à partir du@angular-contrib/common
package .Après avoir importé le module, vous pouvez l'ajouter
host: { ngNoHost: '' }
à votre@Component
décorateur et aucun élément d'emballage ne sera rendu.la source