Estoy luchando por encontrar una manera de hacer esto. En un componente principal, la plantilla describe a tabley su theadelemento, pero delega la representación tbodya 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 tretiqueta, 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 tbodyque solo puede contener trelementos (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, DynamicComponentLoaderel 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?setAttributeno 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-containernuevo 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-resultes necesario poder crear nuevosmy-resulthermanos. Entonces, imagina que tienes una jerarquíamy-resulten 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 internotbodyni 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: contentsaquí está mi barra de herramientas scss:
y el html:
y en uso:
fuente
Otra opción hoy en día es la
ContribNgHostModulepuesta a disposición del@angular-contrib/commonpaquete .Después de importar el módulo, puede agregarlo
host: { ngNoHost: '' }a su@Componentdecorador y no se procesará ningún elemento de envoltura.fuente