Estoy tratando de construir un componente personalizado usando múltiples ng-content
en Angular 6, pero esto no funciona y no tengo idea de por qué.
Este es mi código de componente:
<div class="header-css-class">
<ng-content select="#header"></ng-content>
</div>
<div class="body-css-class">
<ng-content select="#body"></ng-content>
</div>
Estoy tratando de utilizar este componente en otro lugar y hacer dos dentro de código HTML diferente body
y el encabezado select
de ng-content
, algo como esto:
<div #header>This should be rendered in header selection of ng-content</div>
<div #body>This should be rendered in body selection of ng-content</div>
Pero el componente se está quedando en blanco.
¿Saben lo que podría estar haciendo mal o cuál es la mejor manera de renderizar dos secciones diferentes en el mismo componente?
¡Gracias!
angular
angular6
angular-components
ng-content
Lucas Santos
fuente
fuente
Respuestas:
header
ybody
en lugar de referencias de plantilla(#header, #body)
.ng-content
conselect
atributo likeselect="[header]"
.app.comp.html
<app-child> <div header >This should be rendered in header selection of ng-content</div> <div body >This should be rendered in body selection of ng-content</div> </app-child>
child.comp.html
<div class="header-css-class"> <ng-content select="[header]"></ng-content> </div> <div class="body-css-class"> <ng-content select="[body]"></ng-content> </div>
MANIFESTACIÓN
fuente
<div header>
con<ng-container header>
.<div header>
con<ng-container header>
obras también.Para ajustarse a las especificaciones del componente web . Incluso si eso es Angular. Se trata de evitar atributos para el selector como directivas angulares o atributos reservados con otro uso. Entonces, solo usamos el atributo "ranura". Veremos
<ng-content select="[slot=foobar]">
como<slot name="foobar">
.Ejemplo:
hello-world.component.html
<ng-content select="[slot=start]"></ng-content> <span>Hello World</span> <ng-content select="[slot=end]"></ng-content>
app.component.html
<app-hello-world> <span slot="start">This is a </span> <span slot="end"> example.</span> </app-hello-world>
Resultado
Ejemplo de Stackblitz
Puede utilizar el nombre que desee, como "plátano" o "pescado". Pero "inicio" y "fin" son una buena convención para colocar elementos antes y después.
fuente
:host
y::ng-deep
en SCSS. Pero este es solo un ejemplo. Consulte Stackblitz Quizás::slotted
/::content
también funcione. Pero no estoy seguro. La web ofrecerá más información sobre este tema. Por lo general, solo debe diseñar el componente en sí. Y evite diseñar cosas fuera (global). De lo contrario, tendrá efectos secundarios no deseados.<div class="end"><ng-content></ng-content></div>
porque este elemento es accesible en el componente. El ng-content es solo un pseudo elemento que es reemplazado por el elemento acoplado afuera. Entonces tienes que usar ng-deep selector.alternativamente, puede utilizar:
app.comp.html
<app-child> <div role="header">This should be rendered in header selection of ng-content</div> <div role="body">This should be rendered in body selection of ng-content</div> </app-child>
child.comp.html
<div class="header-css-class"> <ng-content select="div[role=header]"></ng-content> </div> <div class="body-css-class"> <ng-content select="div[role=body]"></ng-content> </div>
fuente
Complementando las otras respuestas:
También puede hacerlo con etiquetas personalizadas (como
<ion-card>
,<ion-card-header>
y<ion-card-content>
).app.comp.html
<app-child> <app-child-header>This should be rendered in header selection of ng-content</app-child-header> <app-child-content>This should be rendered in content selection of ng-content</app-child-content> </app-child>
child.comp.html
<div class="header-css-class"> <ng-content select="app-child-header"></ng-content> </div> <div class="content-css-class"> <ng-content select="app-child-content"></ng-content> </div>
Recibirá un mensaje de advertencia, pero funcionará. Puede suprimir los mensajes de advertencia o utilizar etiquetas conocidas como
header
ofooter
. Sin embargo, si no le gusta ninguno de estos métodos, debería optar por una de las otras soluciones.fuente