J'expérimente angular2 2.0.0-beta.0
J'ai une table et le contenu de la ligne est généré par angular2 de cette façon:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Maintenant, cela fonctionne et je souhaite encapsuler le contenu dans un composant "table-line".
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
Et dans le composant, le modèle a le contenu <tr> <td>.
Mais maintenant, la table ne fonctionne plus. Ce qui signifie que le contenu n'est plus affiché dans les colonnes. Dans le navigateur, l'inspecteur me montre que les éléments DOM ressemblent à ceci:
<table>
<table-line ...>
<tbody>
<tr> ....
Comment puis-je faire fonctionner cela?
tr
balise personnalisée, il sera utilisé, sinon c'est le comportement par défaut du navigateur. Vous pouvez également ajouter des attributs ou des classes à votre sélecteur de composants comme<tr line-item>
avec un sélecteur de composants"tr[line-item] "
ou<tr class="line-item">
avec un sélecteur de composantstr.line-item
. De cette façon, vous avez un contrôle total. Je n'ai encore essayé rien de tout cela moi-même dans Angular2, mais je suis presque sûr que cela fonctionne.tslint
moi directement au guide de style recommandant contre cela. Je n'aime pas désactiver les règles de peluchage recommandées, mais pour autant que je sache, cela semble une règle de style assez arbitraire et inévitable dans certaines situations (comme le problème d'OP)<li>
ou similaire, je ne vois aucune raison de ne pas l'utiliser.J'ai trouvé l'exemple très utile mais il n'a pas fonctionné dans la version 2.2.3, donc après beaucoup de grattage à la tête, il a fonctionné à nouveau avec quelques petits changements.
la source
MyTrComponent
àapp.module.ts
et fonctionne très bien.Voici un exemple d'utilisation d'un composant avec un sélecteur d'attribut:
Production:
Bien sûr, le modèle dans MyTrComponent serait plus impliqué, mais vous voyez l'idée.
Vieux (beta.0) plunker .
la source
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
L'ajout de «affichage: contenu» au style du composant a fonctionné pour moi.
CSS:
HTML:
Pourquoi ça marche?
Lors de l'instanciation d'un composant, angular (après la compilation) encapsule le contenu du composant dans le DOM comme suit:
Mais pour que le tableau s'affiche correctement, le
tr
balises ne peuvent être enveloppées par rien.Donc, nous ajoutons
display: contents
, à ce nouvel élément. Si je comprends bien, cela indique à l'explorateur que cette balise ne doit pas être rendue et affiche le contenu interne comme s'il n'y avait pas de retour à la ligne. Ainsi, tant que la balise existe toujours, elle n'affecte pas visuellement la table, et lestr
balises sont traitées comme si elles étaient des enfants directs dutable
balise.Si vous souhaitez en savoir plus sur le fonctionnement du contenu: https://bitsofco.de/how-display-contents-works/
la source
contents
fonctionne, donc je ne voulais pas y mettre d'informations basées sur de fausses hypothèses ... J'ai ajouté l'explication telle que je la comprends, mais si quelqu'un remarque qu'il y a une erreur, n'hésitez pas à le signaler ^ ^. J'ai également ajouté un lien pour que les gens puissent enquêter plus avant ... Une chose que j'ai remarquée, alors que cela dit que cela ne fonctionne pas sur IE11, je l'ai essayé sur IE 11.657.18362.0 et cela a bien fonctionné (mais, puisque je suis en utilisant angular, il pourrait y avoir un polyfill quelque part, donc je ne le garantirais pas à 100% sur d'autres environnements)essaye ça
la source