【Angular开发】Angular中的高级组件

angular

在这个博客中,我将解释Angular中的几个高级组件和机制,它们增强了灵活性、可重用性和性能。

通过熟悉这些高级组件和机制,您可以提高您的Angular开发技能,并在应用程序中利用灵活性、可重用性和性能优化的能力。让我们开始吧!

NgContent

NgContent,或Angular中的内容投影,通过将内容从外部投影到组件中,可以实现灵活和可重用的组件。当您希望动态地将内容传递给组件时,通常会使用它。

还有Input和Outputoperator,它们的作用与NgContent组件相同。输入操作符允许组件从外部接收数据,而输出操作符允许组件向外部发出事件。所以这两个操作符只处理数据。当涉及到NgContent时,它用于投影组件的内容,如HTML代码,您可以动态指定它们。通过这种方式,增加了组件的灵活性,并确保了可重用性。

让我们从一个简单的例子开始。想象一下,您想要创建一个包含标题、作者姓名、日期和内容的博客文章组件。您可以创建这样的组件:

// Blog Post Component
@Component({
selector: 'app-blog-post',
  template: `
    <div class="blog-post">
      <h2>{{ title }}</h2>
      <p class="author">Author: {{ author }}</p>
      <p class="date">Date: {{ date }}</p>
      <ng-content select=".blog-post-content"></ng-content>
      <ng-content select=".blog-post-sidebar"></ng-content>
    </div>
  `,
})
export class BlogPostComponent {
  @Input() title: string;
  @Input() author: string;
  @Input() date: string;
}

在此组件中,<ng content></ng content>标记用于指定内容的投影位置。使用该组件时,可以按如下方式投影内容:

// Home Component
@Component({
  selector: 'app-home',
  template:`
  <h1> Home Component</h1>
  <br>
  <app-blog-post title="Angular is a Powerful Framework" author="Atakan KOREZ" date="June 21, 2023">
    <p>Angular is a powerful framework for building modern web applications.</p>
    <p>...</p>
  </app-blog-post>
  `
})
export class HomeComponent {
}

Output:

angular

多个NgContent

此外,让我们提供一个多ng内容使用的示例。假设您希望将内容投影在博客文章标题的下方和旁边。为了实现这一点,您可以使用select关键字更新组件。此外,在没有选择任何内容的情况下发送的数据由NgContent接收,它没有选择器关键字(如果有的话)。示例如下:

// Blog Post Component
@Component({
  selector: 'app-blog-post',
  template: `
    <div class="blog-post">
      <h2>{{ title }}</h2>
      <p class="author">Author: {{ author }}</p>
      <p class="date">Date: {{ date }}</p>
      <ng-content select=".blog-post-content"></ng-content>
      <ng-content select=".blog-post-sidebar"></ng-content>

      <ng-content></ng-content>
    </div>
  `,
})
export class BlogPostComponent {
  @Input() title: string;
  @Input() author: string;
  @Input() date: string;
}

//Home Component
@Component({
  selector: 'app-home',
  template:`
  <h1> Home Component</h1>
  <br>
  <app-blog-post title="Angular is a Powerful Framework" author="Atakan KOREZ" date="June 21, 2023">
  <div class="blog-post-content">
    <p>Angular is a powerful framework for building modern web applications.</p>
    <p>...</p>
  </div>
  <div class="blog-post-sidebar">
    <p>Other posts by the author:</p>
    <ul>
      <li>...</li>
      <li>...</li>
    </ul>
  </div>

Rest without any selector
</app-blog-post>
  `
})
export class HomeComponent {
}

Output:

angular

NgContainer

NgContainer充当占位符,动态地包含在Angular中配置的图像。它在创建和管理重复出现的元素时提供了额外的灵活性,尤其是在与*ngFor等构造一起使用时。

你可以说span元素也可以用于这个过程,你可能会问为什么我们使用NgContainer而不是span。你说得对,但当性能突出时,与使用span相比,NgContainer是一种性能非常好的方法。让我试着用下面的例子来解释这个事实。

@Component({
  selector: 'app-root',
  template: `
    <h1> App Component</h1>
    <br>  
    <div class="mt-5">
      <ul>
        <span *ngFor="let product of products">
          <li *ngIf="product.available">{{ product.productName }}</li>
        </span>
      </ul>
    </div>

    <div class="mt-5">
      <ul>
        <ng-container *ngFor="let product of products">
          <li *ngIf="product.available">{{ product.productName }}</li>
        </ng-container>
      </ul>
    </div>
  `,
})
export class AppComponent {
  products: any[] = [
    { productName: 'Pencil', available: true },
    { productName: 'Book', available: false },
    { productName: 'Notebook', available: true },
    { productName: 'Eraser', available: false },
    { productName: 'School Bag', available: true },
  ];
}

在上面的示例代码中,Products数组的元素根据其可用状态在页面上列出。使用span和ngContainer列出了相同的元素。到目前为止,一切都很正常,但当我们检查页面的HTML输出时,就会出现差异。

输出:

angular

从输出中可以看出;当使用span时,5 lielement是在不注意可用属性的情况下创建的,而使用ngContainer只会创建与可用元素数量一样多的元素。这样可以使HTML代码更干净、更高效。

在这些关键信息之后,我希望您从现在起永远使用ngContainer:)

NgTemplate

NgTemplate允许在Angular中的HTML模板中创建部分或区域。NgContainer和NgTemplate在渲染行为方面有区别。与自动渲染的NgContainer不同,NgTemplate需要显式调用并包含在渲染过程中才能可见。

@Component({
  selector: 'app-root',
  template: `
    <h1> App Component</h1>
    <br>  
    <ng-container *ngTemplateOutlet="template1">
      Container info...
    </ng-container>
    <ng-template #template1>
      Template info...
    </ng-template>
  `,
})
export class AppComponent {
}

Output:

angular

从Output中可以看到,ngTemplate覆盖了ngContainer。此外,在Angular项目中,NgContainer经常与ngIf和ngSwitch等结构一起使用。因此,以可控的方式容易地处理向页面操作添加/移除新元素。

//ngIf example

<ng-template #myTemplate>
  <p>This template is rendered conditionally.</p>
</ng-template>

<div *ngIf="showTemplate; then myTemplate"></div>

//ngSwitch example

<ng-template #templateOne>
  <p>This is template one.</p>
</ng-template>

<ng-template #templateTwo>
  <p>This is template two.</p>
</ng-template>

<div [ngSwitch]="value">
  <div *ngSwitchCase="'A'">
    <ng-container [ngTemplateOutlet]="templateOne"></ng-container>
  </div>
  <div *ngSwitchCase="'B'">
    <ng-container [ngTemplateOutlet]="templateTwo"></ng-container>
  </div>
</div>

ngTemplateOutletContext:我们可以使用ngTemplateOutlet Context向ngTemplate提供绑定数据。这允许我们将值传递给ngTemplate内部的变量。以下是一个示例:

<ng-template #myTemplate let-name="name">
  <p>Hello, {{ name }}!</p>
</ng-template>

<ng-container [ngTemplateOutlet]="myTemplate" [ngTemplateOutletContext]="{ name: 'Atakan' }"></ng-container>

在上面的示例中,ngTemplateOutletContext用于将值“Atakan”分配给名称变量,然后在ngTemplate中使用该值。这种控制机制使我们能够以更灵活和动态的方式使用ngTemplate。

Renderer2

Renderer2是一种服务,用于以独立于平台的方式执行DOM操作,而不是直接操纵DOM。Renderer2遵循Angular的安全模型,并确保跨平台兼容性,这使得它在使用Angular Universal等平台时特别有用。以下是使用Renderer2而不是JS或JQuery来操作DOM的一些优点:

  • 平台独立性:Renderer2为执行DOM操作提供了一个特定于平台的后端,允许Angular应用程序在不同的平台上工作。
  • 安全性:Renderer2的操作符合Angular的安全模型。Renderer2允许安全的DOM操作,而不是直接的DOM操作。
  • 性能和优化:Renderer2优化了Angular的更改检测机制,并更有效地应用更改。更改可以在单个更新周期内分批进行,以提高性能。

以下是一个示例:

@Component({
  selector: 'app-example',
  template: `
    <button (click)="changeColor()">Change Color</button>
  `,
})
export class ExampleComponent {
  constructor(private elementRef: ElementRef, private renderer: Renderer2) {}

  changeColor() {
    const button = this.elementRef.nativeElement.querySelector('button');
    this.renderer.setStyle(button, 'background-color', 'blue');
    this.renderer.setStyle(button, 'color', 'white');
  }
}

在上面的示例中,我们创建了一个名为ExampleComponent的组件。Renderer2被注入到组件的构造函数中。changeColor()方法更改按钮的背景色和文本色。DOM操作是通过Renderer2执行的,允许安全地分配样式属性。因此,使用Renderer2可以确保Angular应用程序更加安全、可移植和高性能。

结论

在这个博客中,我解释了Angular中增强灵活性、可重用性和性能的高级组件和机制。通过利用这些组件和机制,开发人员可以实现灵活和可重用的组件、干净高效的代码、条件呈现和安全的DOM操作,从而增强Angular应用程序。

通过将这些高级组件和机制集成到Angular项目中,您可以解锁新级别的灵活性、可重用性和性能优化。利用NGContent、NgContainer、NgTemplate和Renderer2的强大功能,轻松构建健壮、动态的应用程序。

本文:【Angular开发】Angular中的高级组件 | 程序员云开发,云时代的程序员.

欢迎收藏【架构师酒馆】和【开发者开聊】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用dockerfile 构建自己的nacos-mysql

前言 在部署nacos的时候触发的脑袋灵光一闪&#xff0c;每次部署nacos都要部署下mysql服务器&#xff0c;然后导入sql语句&#xff0c;配置nacos配置文件&#xff0c;那有没有简单的方法实现一键部署nacos和nacos-mysql 呢? 答案是肯定&#xff01;如下目录图&#xff1a; …

ctfhub技能树_web_信息泄露

目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注&#xff1…

寻找峰值00

题目链接 寻找峰值 题目描述 注意点 数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可对于所有有效的 i 都有 nums[i] ! nums[i 1]可以假设 nums[-1] nums[n] -∞ 解答思路 可以根据二分查找保证在O(log n)的时间复杂度找到峰…

数据中心的操作系统——kubernets

操作系统的功能和模块与 Kubernetes 的功能和模块做了一个对比&#xff1a; Kubernetes 作为数据中心的操作系统还是主要管理数据中心里面的四种硬件资源&#xff1a;CPU、内存、存储、网络。 对于 CPU 和内存这两种计算资源的管理&#xff0c;我们可以通过 Docker 技术完成。…

【数据分享】11个城市的出租车(网约车)数据(免费获取)

出租车&#xff08;网约车&#xff09;GPS数据是我们最常使用的交通大数据之一&#xff0c;但是出租车&#xff08;网约车&#xff09;GPS数据没有公开的获取渠道&#xff0c;有些学者可能能通过与相关机构合作拿到数据&#xff0c;但是对于绝大多数普通人是没有这个机会的&…

跳水比赛(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

navicate16 2059 plugin http could not be loaded

plugin http could not be loaded 乱码 library path http.dll 今天新装一台机子的navicate遇到这个问题。 查了半天都是说 caching_sha2_password’的解决办法。 然后是咋解决的呢&#xff0c;真是丢脸 由于我是直接从浏览器复制下来的ip&#xff0c;所以虽然我只复制了ip地…

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错

我使用java代码 构建项目&#xff0c;初始代码运行就会报错。我使用的是Android Studio Giraffe&#xff08;Adroid-studio-2022.3.1.18-windows&#xff09;。我在网上找的解决办法是删除重复的类&#xff0c;但这操作起来真的太麻烦了。 这是全部报错代码&#xff1a; Dupli…

QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』

前文链接&#xff1a;QGraphicsView实现简易地图6『异步加载-单瓦片-无底图』 前一篇文章提到的异步单瓦片加载&#xff0c;是指线程每准备好一个瓦片数据后&#xff0c;立刻抛出信号让主线程加载。而本篇异步多瓦片加载是指线程准备好所有瓦片数据后&#xff0c;一起抛出信号让…

迅软DSE:为企业描绘安全蓝图,构建无忧网络办公天地

企业员工的不规范上网行为已成为管理人员面临的挑战&#xff0c;而利用上网行为管理软件则成为解决问题的最佳途径。 上网行为管理软件具备全面监控功能&#xff0c;可监控QQ、微信、电脑邮件、文件外发等行为&#xff0c;保证监控过程隐蔽而安全。通过实时屏幕监控功能&#…

[NAND Flash 2.3] 闪存芯片国产进程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 目录 前言1 闪存介质1.1 NOR 闪存国产技术发展1.2 NAND 闪存国产技术 2 闪存国产厂商与产品2.1 NOR FLASH 国产厂商与产品2.2 NAND FA…

【Redis】redis 高性能--线程模型以及epoll网络框架

目录 一.前言 二.多线程的弊端 2.1 锁的开销问题 2.2 多线程上下文切换带来的额外开销 2.3 多线程占用内存成本增高 三.基本IO模型与epoll 模式 3.1 基本IO模型 3.2 单线程处理机制 四.总结 一.前言 我们经常讨论到&#xff0c;redis 是单线程&#xff0c;那为什么单线…

玩弄GPTs:人人都会的Prompt模板

角色定义 分享一个自用的Prompt模板&#xff0c;只要学会了这个模板&#xff0c;当遇到新场景时&#xff0c;直接套用就行。 简单总结&#xff1a; 角色定义(Master)背景(Background)规则(rule)技能(skill)限制(constaints)工作流(workflow) 经过实际测试发现&#xff0c;这…

矩阵快速幂及应用实战[C/C++]

矩阵快速幂 矩阵快速幂可以用来优化递推问题&#xff0c;如状态机DP&#xff0c;需要一丢丢线性代数里面矩阵的概念&#xff0c;只需要知道简单的矩阵乘法&#xff0c;结合我们普通的二分快速幂就能很快的掌握矩阵快速幂。 问题引入 三步问题。有个小孩正在上楼梯&#xff0c;楼…

Axure RP免费版:详细信息抢先知道

Axure RP收费吗&#xff1f; 是的&#xff0c;AxureRP是一种收费的原型设计工具。它提供了两种选择&#xff1a;免费试用版和付费版。免费试用版可免费使用30天&#xff0c;功能与付费版相同&#xff0c;但导出时会有Axure水印&#xff0c;文件无法保存。付费版分为Pro版和Tea…

麒麟V10安装kerberos客户端

麒麟V10系统安装kerberos客户端 当系统具备yum镜像源的时候需要执行安装命令 yum install krb5-devel krb5-client krb5-libs -y 会提示报错 “未找到匹配的参数:krb5-client” 此时我们需要手动安装krb5-client 安装包链接放到了这里 链接: https://pan.baidu.com/s/1x1YVr6…

web:[SUCTF 2019]CheckIn(一句话木马,.user.ini)

题目 页面显示 上传文件&#xff0c;随便上传一个文件试试 上传了一个文本&#xff0c;显示失败&#xff0c;不是图片 那就换图片马上传试试 不能包含<?,换一种写法&#xff0c;需要加上GIF89a&#xff0c;进行exif_imagetype绕过 上传成功 这里用.user.ini或者用post传参…

SpringBoot MyBatis连接数据库 查询数据(注解方式)

创建项目时选择依赖 配置数据库连接 在resources中的 application.properties 配置文件进行连接的配置 #驱动名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver#连接地址 spring.datasource.urljdbc:mysql://10.20.22.11:26954/canteen#数据库用户名 spring.d…

国内AI大模型已近80个,哪个最有前途?

目前&#xff0c;国内已经推出了近80个人工智能大模型&#xff0c;这些大模型各有优势&#xff0c;难以直接判断哪个最有前途。然而&#xff0c;以下几个大模型值得关注&#xff1a; 1、华为云盘古大模型&#xff1a;盘古大模型聚焦于为行业服务&#xff0c;包括自然语言、视觉…

从认识到精通,一文读懂Memcached知识文集

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…