Estoy luchando por encontrar una manera de hacer esto. En un componente principal, la plantilla describe a table
y su thead
elemento, pero delega la representación tbody
a otro componente, como este:
<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>
Cada componente myResult genera su propia tr
etiqueta, básicamente así:
<tr>
<td>{{ entry.name }}</td>
<td>{{ entry.time }}</td>
</tr>
La razón por la que no pongo esto directamente en el componente principal (evitando la necesidad de un componente myResult) es que el componente myResult es en realidad más complicado de lo que se muestra aquí, por lo que quiero poner su comportamiento en un componente y archivo separados.
El DOM resultante se ve mal. Creo que esto se debe a que no es válido, ya tbody
que solo puede contener tr
elementos (ver MDN) , pero mi DOM generado (simplificado) es:
<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>
¿Hay alguna forma de que podamos obtener lo mismo renderizado, pero sin la <my-result>
etiqueta de envoltura , y mientras todavía usamos un componente para ser el único responsable de renderizar una fila de la tabla?
He mirado ng-content
, DynamicComponentLoader
el ViewContainerRef
, pero no parecen proporcionar una solución a este por lo que yo puedo ver.
fuente
Respuestas:
Puede utilizar selectores de atributos
y luego úsalo como
fuente
[]
? ¿Agregó el componente adeclarations: [...]
un módulo? Si el componente está registrado en un módulo diferente, ¿agregó este otro módulo alimports: [...]
módulo donde desea utilizar el componente?setAttribute
no es mi código. Pero lo he descubierto, necesitaba usar la etiqueta de nivel superior real en mi plantilla como la etiqueta para mi componente en lugar de unng-container
nuevo uso de trabajo<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>
utilicé esto (después de cambiar li-navigation a un selector de atributos)<ul class="nav navbar-nav" li-navigation [navItems]="menuItems"></ul>
Necesita "ViewContainerRef" y dentro del componente my-result haga algo como esto:
html:
ts:
fuente
@ViewChild('template', {static: true}) template;
my-result
es necesario poder crear nuevosmy-result
hermanos. Entonces, imagina que tienes una jerarquíamy-result
en la que cada fila puede tener filas "secundarias". En ese caso, el uso de un selector de atributos no funcionaría, ya que el primer selector va en eltbody
, pero el segundo no puede ir en un internotbody
ni en untr
.Utilice esta directiva en su elemento
Uso de ejemplo:
y en el html principal, llama al elemento de tarjeta como de costumbre, por ejemplo:
La salida será:
fuente
Los selectores de atributos son la mejor manera de resolver este problema.
Entonces, en tu caso:
mis-resultados ts
mis-resultados html
mi-resultado ts
html de mi resultado
Ver stackblitz de trabajo: https://stackblitz.com/edit/angular-xbbegx
fuente
puedes intentar usar el nuevo css
display: contents
aquí está mi barra de herramientas scss:
y el html:
y en uso:
fuente
Otra opción hoy en día es la
ContribNgHostModule
puesta a disposición del@angular-contrib/common
paquete .Después de importar el módulo, puede agregarlo
host: { ngNoHost: '' }
a su@Component
decorador y no se procesará ningún elemento de envoltura.fuente