在Angular的ContentChildren中渲染组件

时间:2018-03-14 21:25:22

标签: angular components

这是我的组成部分:

import { Component, OnInit, ContentChildren, QueryList } from '@angular/core';
import { IconBoxComponent } from '../icon-box/icon-box.component';

@Component({
  selector: 'app-three-icon-box',
  templateUrl: './three-icon-box.component.html',
  styleUrls: ['./three-icon-box.component.scss']
})
export class ThreeIconBoxComponent implements OnInit {
  @ContentChildren(IconBoxComponent) boxes: QueryList<IconBoxComponent>;

  constructor() { }

  ngOnInit() {
  }

  ngAfterContentInit() {
    console.log(this.boxes);
  }

}

它的模板如下所示:

<div class="row justify-content-center">
  <div class="col-12 col-md-10">
    <div class="row justify-content-center text-center">
      <div *ngFor="let box of boxes" class="col-12 col-sm-4 col-lg-3 offset-lg-1 lz-mb-2 lz-mb-sm-0">
        {{ box }}
      </div>
    </div>
  </div>
</div>

这就是我渲染它的方式:

  <app-three-icon-box>
    <app-icon-box icon="#icon-one">content 1</app-icon-box>
    <app-icon-box icon="#icon-two">content 2</app-icon-box>
    <app-icon-box icon="#icon-three">content 3</app-icon-box>
  </app-three-icon-box>

在第二段代码中,我正在尝试渲染<app-icon-box>,但我无法弄清楚如何。 {{ box }}只是想知道我要做什么,但我得到[object Object]

2 个答案:

答案 0 :(得分:3)

你应该使用这种模式

  1. 创建TemplateMarker指令以标记要作为参数传递的templates(以防止抓取other templates)。
  2. 使用@ContentChildren注入标记。
  3. 使用NgTemplateOutlet将其呈现在您需要的位置。
  4. 提示:您可以多次渲染每个模板并send them parameters

    示例:

    import { Component, Input, Directive, TemplateRef, ContentChildren, QueryList } from '@angular/core';
    @Directive({
      selector: '[templateMarker]'
    })
    export class TemplateMarker {
      constructor(public template: TemplateRef<any>) {}
    }
    @Component({
      selector: 'template-owner',
      template: `
        <div *ngFor="let marker of markers">
          <i><ng-template [ngTemplateOutlet]="marker.template"></ng-template></i>
        </div>
      `,
    })
    export class TemplateOwner {
      @ContentChildren(TemplateMarker) markers: QueryList<TemplateMarker>;
    }
    @Component({
      selector: 'hello',
      template: `<template-owner>
        <div *templateMarker>first template</div>
        <div *templateMarker>second template</div>
      </template-owner>`,
    })
    export class HelloComponent  {}
    

答案 1 :(得分:0)

有点不清楚你需要什么。 但我想使用ng-content就足够了。删除ContentChildren以及ngFor,然后使用

<body>
<script src="external.js"></script>
<script>

  db.collection("users").get().then((querySnapshot) => {
  querySnapshot.forEach((doc) => {

              readInData();
  });

</script>

在你的模板中。

然后,您必须直接在声明框组件的位置添加类。

<ng-content></ng-content>

要丰富ThreeIconBoxComponent中的投影组件,您需要使用模板和模板插座完全不同的方法。