Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

272
Visualizações
Angular pasa múltiples plantillas a Componente

Estoy tratando de crear un componente que acepte múltiples plantillas como entradas. Este es el ejemplo que tengo:

 @Component({ selector: 'data-list', styles: [ require('./data-list.component.scss') ], template: ` <ng-template *ngFor="let item of itemsData" ngFor let-item [ngForOf]="[item]" [ngForTemplate]="itemTemplate" ></ng-template> ` }) export class DataListComponent { @Input() itemsData: any[]; @ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>; }

Como puede ver, es un componente bastante simple que estoy probando. Este componente simplemente acepta los datos de los elementos que se mostrarán, así como la plantilla del elemento. Este componente se puede utilizar así:

 <data-list [itemsData]="data"> <ng-template let-item> <h1>{{ item.header }}</h1> <div>{{ item.content }}</div> </ng-template> </data-list>

Como se muestra arriba, paso la plantilla usando ng-content que luego lee DataListComponent con @ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>; .

Mi pregunta es si es posible pasar varias plantillas a un componente.

Como ejemplo, se pasaría la plantilla para los artículos, pero se necesita una plantilla diferente en caso de que sea el primer artículo. Esto significaría que la verificación del primer elemento se realizaría en DataListComponent pero luego usaría una plantilla especificada por el componente que la usa.

Ejemplo sencillo:

ingrese la descripción de la imagen aquí

Puedo hacer algo así para atender esto:

 @Component({ selector: 'data-list', styles: [ require('./data-list.component.scss') ], template: ` <span *ngFor="let item of itemsData; let i = index" > <ng-template *ngIf="i > 0; else nextTmpl" ngFor let-item [ngForOf]="[item]" [ngForTemplate]="itemTemplate" ></ng-template> </span> <ng-template #nextTmpl> Next </ng-template> ` })

Sin embargo, así, la "Plantilla siguiente" no está especificada por el componente que usa DataListComponent y, por lo tanto, siempre será la misma plantilla.

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Resolví este mismo problema usando el selector de cadenas disponible para el decorador de ContentChild.

Deberá especificar variables de plantilla cuando utilice su componente de lista de datos:

 <data-list [itemsData]="data"> <ng-template #firstItemTemplate let-item> <h1 style="color:red;">{{ item.header }}</h1> <div>{{ item.content }}</div> </ng-template> <ng-template #standardTemplate let-item> <h1>{{ item.header }}</h1> <div>{{ item.content }}</div> </ng-template> </data-list>

Luego, dentro de su clase de componente de lista de datos, asigne las variables de plantilla a las variables locales en el componente:

 @Input() itemsData: any[]; @ContentChild('firstItemTemplate') firstItemTemplate: TemplateRef<ElementRef>; @ContentChild('standardTemplate') standardTemplate: TemplateRef<ElementRef>;

Después de esto, podrá representar las plantillas pasadas desde su componente de lista de datos.

 @Component({ selector: 'data-list', styles: [ require('./data-list.component.scss') ], template: ` <span *ngFor="let item of itemsData; let i = index" > <ng-template *ngIf="i == 0; else nextTmpl" ngFor let-item [ngForOf]="[item]" [ngForTemplate]="firstItemTemplate" ></ng-template> <ng-template #nextTmpl ngFor let-item [ngForOf]="[item]" [ngForTemplate]="standardTemplate" ></ng-template> </span> ` })
about 4 years ago · Santiago Trujillo Relatório

0

Prueba esto en su lugar.

 @Component({ selector: 'data-list', styles: [ require('./data-list.component.scss') ], template: ` <ng-template ngFor [ngForOf]="itemsData" [ngForTemplate]="itemTemplate"></ng-template> ` }) export class DataListComponent { @Input() itemsData: any[]; @ContentChild(TemplateRef) itemTemplate: TemplateRef<ElementRef>; }
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda