Estoy experimentando con angular2 2.0.0-beta.0
Tengo una tabla y el contenido de la línea es generado por angular2 de esta manera:
<table>
<tr *ngFor="#line of data">
.... content ....
</tr>
</table>
Ahora esto funciona y quiero encapsular el contenido en un componente "línea de tabla".
<table>
<table-line *ngFor="#line of data" [data]="line">
</table-line>
</table>
Y en el componente, la plantilla tiene el contenido <tr> <td>.
Pero ahora la mesa ya no funciona. Lo que significa que el contenido ya no se muestra en columnas. En el navegador, el inspector me muestra que los elementos DOM se ven así:
<table>
<table-line ...>
<tbody>
<tr> ....
¿Cómo puedo hacer que esto funcione?
tr
etiqueta personalizada , se utilizará; de lo contrario, se llevará a cabo el comportamiento predeterminado del navegador. También puede agregar atributos o clases a su selector de componentes como<tr line-item>
con un selector de componentes"tr[line-item] "
o<tr class="line-item">
con un selector de componentestr.line-item
. De esta forma tienes el control total. Todavía no he probado nada de esto en Angular2, pero estoy bastante seguro de que funciona.tslint
mí directo a la guía de estilo de recomendar en contra de esto. No me gusta desactivar las reglas de pelusa recomendadas, pero por lo que puedo decir, parece una regla de estilo bastante arbitraria e inevitable en algunas situaciones (como el problema de OP)<li>
o similar, no veo ninguna razón para no usarlo.Encontré el ejemplo muy útil, pero no funcionó en la versión 2,2.3, así que después de mucho rascar la cabeza lo hice funcionar nuevamente con algunos pequeños cambios.
fuente
MyTrComponent
elapp.module.ts
y funciona bien.A continuación, se muestra un ejemplo que utiliza un componente con un selector de atributos:
Salida:
Por supuesto, la plantilla en MyTrComponent sería más complicada, pero entiendes la idea.
Antiguo (beta.0) plunker .
fuente
Error: Uncaught (in promise): Error: Template parse errors: Can't bind to 'myTr' since it isn't a known property of 'tr'.
Agregar 'display: contents' al estilo del componente funcionó para mí.
CSS:
HTML:
¿Por qué funciona esto?
Al crear una instancia de un componente, angular (después de compilar) envuelve el contenido del componente en el DOM de la siguiente manera:
Pero para que la tabla se muestre correctamente, las
tr
etiquetas no pueden estar envueltas por nada.Entonces, agregamos
display: contents
, a este nuevo elemento. Según tengo entendido, lo que esto hace es decirle al explorador que esta etiqueta no debe procesarse y mostrar el contenido interno como si no hubiera ningún ajuste. Por lo tanto, aunque la etiqueta aún existe, no afecta visualmente a la tabla y lastr
etiquetas se tratan como si fueran hijos directos de latable
etiqueta.Si desea investigar más sobre cómo funcionan los contenidos: https://bitsofco.de/how-display-contents-works/
fuente
contents
funciona, así que no quería poner allí información basada en suposiciones falsas ... Agregué la explicación tal como la entiendo, pero si alguien nota que hay un error, no dude en señalarlo ^ ^. También agregué un enlace para que la gente pueda investigar más ... Una cosa que noté, aunque dice que esto no funciona en IE11, lo probé en IE 11.657.18362.0 y funcionó bien (pero, ya que estoy usando angular, podría haber un polyfill en alguna parte, por lo que no lo garantizaría al 100% en otros entornos)prueba esto
fuente