文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

angular内容投影怎么实现

2023-06-22 05:05

关注

这篇文章主要讲解了“angular内容投影怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“angular内容投影怎么实现”吧!

单内容投影

利用ng-content来实现

<!-- 组件 - app-content-single --><div>  <h3>标题</h3>  <!-- 投影内容显示位置 -->  <ng-content></ng-content></div><!-- 使用 --><app-content-single>  <div>this is content</div></app-content-single>

多内容投影

利用ng-content来实现

<!-- 组件 - app-content-more --><div>  <h4>Herder Title</h4>  <ng-content select=".header"></ng-content>  <h4>Body Title</h4>  <ng-content select="[body]"></ng-content>  <h4>Default Title</h4>  <ng-content></ng-content>  <h4>Footer Title</h4>  <ng-content select="footer"></ng-content></div><!-- 使用 --><app-content-more>  <div>this is default01</div>  <div class="header">this is header</div>  <div>this is default02</div>  <div body>this is body</div>  <div>this is default03</div>  <footer>this is footer</footer>  <div>this is default04</div></app-content-more>

有条件的内容投影-ng-template, ng-container, directive 等来配合实现

单个条件的内容投影

eg: 假设现在有一个人员列表,当某个人的money大于200的时候,额外添加组件中模板定义的内容

定义一个 appChildRef 指令来配合 ng-template 获取模板

import { Directive, TemplateRef } from '@angular/core';@Directive({  selector: '[appChildRef]'})export class ChildRefDirective {  constructor(public templateRef: TemplateRef<any>) { }}

app-persons - html

<div class="list-item" *ngFor="let person of persons;">  <div>Name: {{ person.name }}</div>  <div>Money: {{ person.money }}</div>  <div *ngIf="person.money > 200">    <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container>  </div></div>

app-persons - ts

import { Component, ContentChild, OnInit } from '@angular/core';import { ChildRefDirective } from '../../../../directives/child-ref.directive';@Component({  selector: 'app-persons',  templateUrl: './persons.component.html',  styleUrls: ['./persons.component.scss']})export class PersonsComponent implements OnInit {  persons: { name: string; money: number; }[] = [    { name: '杰克', money: 120 },    { name: '李莉', money: 210 },    { name: '张三', money: 170 },  ];  @ContentChild(ChildRefDirective, { static: true }) childRef!: ChildRefDirective;  constructor() { }  ngOnInit(): void { }}

使用

<app-persons>  <ng-template appChildRef>    <div >this is child ref content</div>  </ng-template></app-persons>

效果图

angular内容投影怎么实现

多个条件内容投影

eg: 现在希望通过 persons 数据中的字段进行绑定内嵌的模板来显示

appChildRef 调整

import { Directive, Input, TemplateRef } from '@angular/core';@Directive({  selector: '[appChildRef]'})export class ChildRefDirective {  // 接受定义模板名称-通过这个名称和 persons 中的render字段对应进行显示对应的模板内容  @Input() appChildRef!: string;  constructor(public templateRef: TemplateRef<any>) { }}

app-persons - html

<div class="list-item" *ngFor="let person of persons;let i=index;">  <div>Name: {{ person.name }}</div>  <div>Money: {{ person.money }}</div>  <!-- <div *ngIf="person.money > 200">    <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container>  </div> -->  <div *ngIf="person.render && tempRefs[person.render]">    <!-- 配合 ngTemplateOutlet 指令给template传递当前person的数据 -->    <ng-container *ngTemplateOutlet="tempRefs[person.render].templateRef; context: { $implicit: person, i: i }"></ng-container>  </div></div>

app-persons - ts

import { Component, ContentChild, ContentChildren, OnInit, QueryList } from '@angular/core';import { ChildRefDirective } from '../../../../directives/child-ref.directive';@Component({  selector: 'app-form-unit',  templateUrl: './form-unit.component.html',  styleUrls: ['./form-unit.component.scss']})export class FormUnitComponent implements OnInit {  persons: { name: string; money: number; render?: string; }[] = [    { name: '杰克', money: 120, render: 'temp1' },    { name: '李莉', money: 210, render: 'temp2' },    { name: '张三', money: 170, render: 'temp3' },  ];  // @ContentChild(ChildRefDirective, { static: true }) childRef!: ChildRefDirective;  @ContentChildren(ChildRefDirective) childrenRef!: QueryList<ChildRefDirective>;  get tempRefs() {    const aObj: any = {};    this.childrenRef.forEach(template => {      const key: string = template.appChildRef;      aObj[key] = template;    })    return aObj;  }  constructor() { }  ngOnInit(): void { }}

使用

<app-persons>  <ng-template appChildRef="temp1" let-person let-index="i">    <div >{{index}}-{{person.name}}: this is temp1</div>  </ng-template>  <ng-template appChildRef="temp2" let-person let-index="i">    <div >{{index}}-{{person.name}}: this is temp2</div>  </ng-template>  <ng-template appChildRef="temp3" let-person let-index="i">    <div >{{index}}-{{person.name}}: this is temp3</div>  </ng-template></app-persons>

效果图

angular内容投影怎么实现

感谢各位的阅读,以上就是“angular内容投影怎么实现”的内容了,经过本文的学习后,相信大家对angular内容投影怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯