首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ngForTemplate -通过ContentChild使用模板,或者回到默认状态

ngForTemplate -通过ContentChild使用模板,或者回到默认状态
EN

Stack Overflow用户
提问于 2017-05-04 15:11:34
回答 1查看 1.3K关注 0票数 2

使用角4.0.3

我正在尝试创建一个组件来将数组显示为一个列表。我需要将模板传递给这个组件的选项。如果传递了模板,则将使用它呈现列表。否则,应该使用嵌入的模板来呈现。

我找到了一个Plunkr,它部分地解决了我想要做的事情--它展示了如何将模板传递给组件,并让组件呈现使用它。它可以在这里找到:https://embed.plnkr.co/ollxzUhka77wIXrJGA9t/

我已经对其进行了分叉,并尝试添加所需的默认模板功能。为了做到这一点,我:

  • src/app.ts
代码语言:javascript
复制
- Added an instance of the `dynamic-list` component with no template (lines 29-30)

  • src/dynamic-list.component.ts
代码语言:javascript
复制
- Added a fallback template (lines 5-7)
- Modified the `ngForTemplate` reference to use `itemTemplate` if it exists, else falling back to `defaultItemTemplate` (line 4)
- Created a `defaultItemTemplate`, using `@ViewChild(TemplateRef)` to get a reference to the embedded default template

柱塞可以在https://embed.plnkr.co/QtMk3h/找到

当我运行时,我得到了这个异常:

./DynamicListComponent类DynamicListComponent中的错误-内联模板:0:29

我不知道我做错了什么,因为设置*ngForTemplate="itemTemplate"是有效的,但是*ngForTemplate="defaultItemTemplate"*ngForTemplate="itemTemplate || defaultItemTemplate"都不起作用。

我做错了什么?

我还注意到*ngFor被否决了,所以我现在可能是以错误的方式来处理这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-04 19:13:13

我使用Angular4 + added子句重写这个plnkr。

https://plnkr.co/edit/i3czMfuziB9eWkiepEW0?p=preview

代码语言:javascript
复制
  @Component({
    selector: 'dynamic-list',
    template: `<div *ngFor="let item of items">
         <ng-container *ngIf="itemTemplate;else elseBlock">
            <ng-container *ngTemplateOutlet="itemTemplate; context: {\$implicit:item}"></ng-container>
         </ng-container>
    </div>

    <ng-template #elseBlock>else</ng-template>
    `
  })
  export class DynamicListComponent {

    @ContentChild(TemplateRef)
    public itemTemplate: TemplateRef;

    @Input()
    public items: number[];

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


  @Component({
    selector: 'dynamic-list-item',
    template: `<div>
          Template Item #:{{item}}
  </div>`
  })
  export class DynamicListItemTemplateComponent {
    @Input() public item: number;
  }

  @Component({
    selector: 'my-app',
    providers: [],
    template:`
  <h3>Inline</h3>

  <h3>Default</h3>
  <dynamic-list [items]="items">
  </dynamic-list>

  <h3>Not Default</h3>
  <div  *ngFor="let item of items">
    <div>
    Inline template item #: {{item}}
    </div>
  </div>


  <h3>List component with inline template</h3>
  <dynamic-list [items]="items">
    <ng-template let-item>
        Inline template item #: {{item}}
    </ng-template>
  </dynamic-list> 


  <h3>List component with component template</h3>
  <dynamic-list [items]="items">
    <dynamic-list-item template="let item" [item]="item"></dynamic-list-item>
  </dynamic-list> 

    `,
  })
  export class App {
    private items = [1, 2, 3, 4];
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43786732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档