angular之ng-template

简介: angular之ng-template

碎碎念:最开始看到ng-template是在使用ng-zorro的时候,随着使用的越来越多,所有想系统的学习一下,能在以后的项目中灵活运用,有问题的地方,欢迎大家指正~~~~!

前置知识点:
1:ViewContainerRef:用于表示一个视图容器,可添加一个或多个视图。主要作用是创建和管理内嵌视图或组件视图。
可能涉及到的方法:clear()销毁本容器内的所有视图。createEmbeddedView()实例化一个内嵌视图,并把它插入到该容器中。
2:TemplateRef:用于表示内嵌的template模板元素(一组html元素)。通过TemplateRef实例,我们可以方便创建内嵌试图(EmbeddedView),且可以轻松访问到通过ElementRef封装后的nativeElement。需要注意的是组件视图的template模板元素,经过渲染后被替换成comment元素。
3:comment元素:表示不可见的注释,防止所包含的文本或html的源码被浏览器解析和显示。

1:定义
是一个angular元素,它不会直接展示在页面上,需要通过结构化指令将内容渲染到页面上。
我们常用的结构化指令,如*ngIf和*ngFor,其中*是一个语法糖,解开之后会变成ng-template标签

ngIf

<div *ngIf="hero">{
   {
   hero.name}}<div>

解析以后:ngIf变成属性型指令,并被绑定到ng-template上面,同时ngIf的宿主元素被ng-template包裹。

<ng-template [ngIf]="hero">
  <div>{
   {
   hero.name}}<div>
</ng-template>

2:使用
写了一个简单的结构指令,类似于ngIf

<div *appTpl="showTpl;let txt=title;let name">
  <b>{
   {
   txt}}({
   {
   name}})</b>
  啦啦啦,我是卖报小行家
</div>
//ts部分:
showTpl = true;

tpl.directive.ts

import {
    Directive, TemplateRef,ViewContainerRef,Input} from '@angular/core';

@Directive({
   
  selector: '[appTpl]'
})
export class TplDirective {
   

  constructor(
    private templateRef:TemplateRef<any>,
    private viewContainerRef:ViewContainerRef) {
    }
  @Input() set appTpl(bol:boolean) {
   
    if(bol){
   
      this.viewContainerRef.createEmbeddedView(this.templateRef,{
   $implicit:'我是默认的',title:'卖报歌'});
    }else{
   
      this.viewContainerRef.clear();
    }
  }

}

3:扩展:
ngTemplateOutlet:
结构化指令。将提前准备好的TemplateRef(一组html元素)插入到一个内嵌视图。可以通过设置ngTemplateOutletContext来给EmbeddedViewRef附加一个上下文对象,ngTemplateOutletContext是一个对象,该对象中的key可以在模板中使用let语句进行绑定。
ngTemplateOutlet可以绑定到任何元素上。

<ng-container *ngTemplateOutlet="myTpl;context:{title:'儿歌'}"></ng-container>
<ng-template #myTpl let-title="title">
    <h2>{
   {
   title}}</h2>
    <p>我有一头小毛驴</p>
</ng-template>

或者

<ng-container [ngTemplateOutlet]="myTpl" [ngTemplateOutletContext]="{title:'儿歌'}"></ng-container>

使用:自定义标题或者页脚时,可以动态的向指定的组件传入一些内容,组件会把他们插入指定位置。
举个例子

//子组件
<ng-container *ngTemplateOutlet="myTpl;context:{txt:'传递给父元素的东西'}"></ng-container>
@Input('extra') myTpl!:TemplateRef<any>;
//父组件
<ng-test-child [extra]="myTpl"></ng-test-child>
<ng-template #myTpl let-txt="txt">
  <div>传递给子组件的代码片段{
   {
   txt}}</div>
</ng-template>

在上述例子中,传递了templateRef实例,给子组件,子组件通过ngTemplateOutlet和Input接收,同时通过ngTemplateOutletContext传递参数展示在父组件的ng-template上。

综上不难看出,其实使用*ngTemplateOutlet实现的效果和createEmbeddedView效果相同。

相关文章
|
JavaScript
Angular ng-template元素的学习笔记
Angular ng-template元素的学习笔记
141 0
Angular ng-template元素的学习笔记
|
JavaScript 网络架构
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
168 0
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
用SAP Spartacus 一个实际例子理解Angular <ng-template>的用法和工作原理
用SAP Spartacus 一个实际例子理解Angular <ng-template>的用法和工作原理
110 0
用SAP Spartacus 一个实际例子理解Angular <ng-template>的用法和工作原理
|
JavaScript
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
2020国庆节 Angular structual 指令学习笔记(<ng-template>) 包含语法糖解糖过程
|
2月前
|
缓存 JavaScript 前端开发
Angular 应用打包和部署
Angular 应用打包和部署
166 58
|
7天前
|
缓存 监控 JavaScript
Angular 应用打包和部署
【10月更文挑战第16天】Angular 应用的打包和部署是一个综合性的过程,需要考虑多个方面的因素。通过合理的打包和部署策略,可以确保应用在生产环境中稳定运行,并为用户提供良好的体验。你需要根据实际情况选择合适的部署方式,并不断优化和改进部署流程,以适应业务的发展和变化。
|
3月前
|
应用服务中间件 Java Maven
掌控视图的力量!深入解析 JSF 视图管理,揭秘视图生命周期的秘密,让你的应用更高效!
【8月更文挑战第31天】JavaServer Faces (JSF) 是一种强大的框架,用于管理 Web 应用程序的视图。本文通过具体案例介绍 JSF 视图管理的基础知识,包括创建、管理和销毁视图的过程。首先,在 Eclipse 中创建一个新 JSF 项目,并配置 Maven 依赖。接着,在 `WEB-INF` 目录下配置 `web.xml` 文件,设置 JSF servlet。
49 0
|
3月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
56 0
|
3月前
|
开发者 Java 开发框架
JSF与EJB,打造企业级应用的神器!让你的Web应用更加稳定、高效!
【8月更文挑战第31天】在现代企业级应用开发中,JSF(JavaServer Faces)与EJB(Enterprise JavaBeans)是两大核心技术。JSF作为一款基于Java的Web应用框架,以其丰富的UI组件和表单处理功能著称;EJB则专注于提供分布式事务处理及远程调用等企业级服务。两者的结合为企业应用带来了高效便捷的开发模式。下文将通过一个简单的示例展示如何利用JSF进行用户信息的输入与保存,并借助EJB实现相关业务逻辑。尽管这一组合具有明显优势,但在实际应用中还需考虑其局限性并作出合理选择。
51 0
|
3月前
|
开发者 安全 SQL
JSF安全卫士:打造铜墙铁壁,抵御Web攻击的钢铁防线!
【8月更文挑战第31天】在构建Web应用时,安全性至关重要。JavaServer Faces (JSF)作为流行的Java Web框架,需防范如XSS、CSRF及SQL注入等攻击。本文详细介绍了如何在JSF应用中实施安全措施,包括严格验证用户输入、使用安全编码实践、实施内容安全策略(CSP)及使用CSRF tokens等。通过示例代码和最佳实践,帮助开发者构建更安全的应用,保护用户数据和系统资源。
49 0