聊聊Angular中NgTemplateOutlet指令的理解和用法

本篇文章带大家了解一下angular中ngtemplateoutlet指令,介绍一下ngtemplateoutlet这个结构性指令的理解与应用,希望对大家有所帮助!

聊聊Angular中NgTemplateOutlet指令的理解和用法

最近在看一个培训项目的时候有看到这个NgTemplateOutlet这个结构性指令,但是我之前没接触过,不知道这东西是怎么用的,然后,我去官网上去搜了一下这个api(官网链接点这里)。

但是它的这个api说明我看不懂,不知道这个什么所谓的上下文对象是啥,也不知道这个let变量又是啥。然后经过我一整天的翻文档,记笔记,终于搞明白了这是什么东西了,没有搞明白的小伙伴可以参考一下我的上一篇文章:【Angular学习】关于模板输入变量(let-变量)的理解

这篇文章就只是说一下NgTemplateOutlet的用法和使用场景。【相关教程推荐:《angular教程》】

使用方法

这个api按照官网的说法是这样的:

根据一个提前备好的 TemplateRef 插入一个内嵌视图。

我给它翻译一下:使NgTemplateOutlet的宿主元素变成一个内嵌视图——这个内嵌视图是根据一个提前定义好的templateRef模板引用生成的。而宿主元素无论是什么元素,都不会被渲染出来。

我们将官网的示例改一下(因为官网的人命我看不懂):

@Component({  selector: 'ng-template-outlet-example',  template: `        


Hello Hello {{name}}! My name is LeBron {{person}}!`})export class NgTemplateOutletExample { myContext = {$implicit: 'World', lastName: 'James'};}

一个宿主元素可以使用ngTemplateOutlet这个结构性指令,使自己变成任意的一个模板生成的内嵌视图。并且可以给其设置上下文对象。然后我们在这个模板中可以使用let-变量这个模板输入变量来获取上下文对象中的值,这个模板更具灵活性。

应用场景

类似于ng-zorro这个框架的分页组件Pagination(官网链接)。如果我们对默认上一页和下一页的样式或者结构不满意,想要自己调整的话,我们可以提供一个输入属性(@Input定义的属性),来接收一个模板,并且为其提供所必须的属性或者方法。这样的话,我们就可以在不修改组件源码的情况下实现组件的复用。

Demo

我们先定义一个子组件HeroDisplayCard,角色的展示界面

@Component({  selector:'app-hero-display-card',  template:`    

角色列表

  • 角色id:{{h.id}}-- 角色名字:{{h.name}}-- 角色属性:{{h.features}}

`, styles:[ `.hero-card-box{ width: 600px; margin: 10px auto; } .hero-card-item{ list-style: none; } ` ]})export class HeroDisplayCard { public heroesList = [ {id:'013',name:'钟离',features:'rock'}, {id:'061',name:'烟绯',features:'fire'}, {id:'022',name:'迪奥娜',features:'ice'}, {id:'004',name:'诺艾尔',features:'rock'}, ]}

然后将这个组件引入一个父组件当中:

法语写作助手 法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31 查看详情 法语写作助手

@Component({  selector:'app-templateoutlet-app-demo',  template:`      `})export class TemplateOutletAppDemoComponent {}

代码运行一下,效果如图:

1.png

我觉得这个li的样式实在是太丑了,而且顺序也不太对。我希望把角色属性调到角色名字之前。这样的话,如果只是单纯的通过输入属性来更改样式的话就会变得很麻烦,我们可能需要定义非常多的变量来供使用者选择,这样的话有点得不偿失。那么我们何不直接提供一个模板给使用者,我们只需要提供必要的数据就可以了。样式,排版这些自由交给使用者。

那么对于子组件HeroDisplayCard我们可以这么改:

@Component({  selector:'app-hero-display-card',  template:`    

角色列表

  • 角色id:{{h.id}}-- 角色名字:{{h.name}}-- 角色属性:{{h.features}}

`, styles:[ //省略 ]})export class HeroDisplayCard { @Input() cardItemTemplate:TemplateRef; public heroesList = [ // 省略]}

然后我们在父组件中将自定义的模板传入进去:

@Component({  selector:'app-templateoutlet-app-demo',  template:`              
  • 角色id:{{id}}

    角色属性:{{features}}

    角色名字:{{name}}

  • `, styles:[ //在这里写自定义模板的样式 `.hero-card-custom-item{ width: 100%; height: 35px; border: 1px solid #999999; border-radius: 5px; display: flex; justify-content:space-around; align-items: center; margin: 10px 0; } .hero-card-custom-item p { width: 30%; margin: 0; font-size: 20px; color: #666666; } .hero-card-custom-item p span { color: red; }` ]})export class TemplateOutletAppDemoComponent {}

    然后运行一下,效果如图(其实还是很丑):

    2.png

    总结

    使用NgTemplateOutlet这个结构性指令可以增强我们子组件的封装程度,避免需要定义大量的输入属性,导致父组件的模板看起来臃肿不堪。

    更多编程相关知识,请访问:编程入门!!

    以上就是聊聊Angular中NgTemplateOutlet指令的理解和用法的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/559224.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年11月10日 00:14:09
    下一篇 2025年11月10日 00:15:24

    相关推荐

    • 聊聊Angular中怎么将迁移tslint至eslint

      本篇文章带大家继续angular的学习,对比一下tslint和eslint,介绍一下angular中怎么将迁移tslint至eslint,希望对大家有所帮助! 大家好,最近做了Angular从12到13的升级,官方自动把angular.json中的tslint配置去除了,那么咱也最好遵从官方安排用起…

      2025年11月27日 web前端
      000
    • Angular学习之以Tooltip为例了解自定义指令

      本篇文章带大家继续angular的学习,以tooltip为例来了解一下自定义指令,希望对大家有所帮助! 在之前的文章中,我们已经概览了 Angular 的相关内容。在自定义指令的部分,我们已经能够实现编写,但是,在实际场景中,我们还需要标准化的管理。 Angular 是 Angular.js 的升版…

      2025年11月27日 web前端
      000
    • Angular如何进行视图封装?聊聊三种封装模式

      angular如何进行视图封装?下面本篇文章给大家深入了解一下angular encapsulation的三种方式,希望对大家有所帮助! 在日常工作中,当我们定义一个Component的时候,要考虑它的encapsulation封装性,也就是说你期望这个组件里定义的样式是只作用于这个组件,还是想作用…

      2025年11月27日 web前端
      100
    • 聊聊Angular+Service如何改进日志功能

      如何改善angular的日志使用方式?下面本篇文章给大家介绍一下使用angular中的service管理控制台输出,改进日志功能的方法,希望对大家有所帮助! 改善在Angular 应用中的日志使用方式 Angular是一个非常受欢迎的开发框架,前端开发者们喜欢在应用中使用console去调试它们的代…

      2025年11月10日 web前端
      100
    • 带你了解Angular中的组件通讯和依赖注入

      angular组件间怎么进行通讯?依赖注入是什么?下面本篇文章带大家简单了解一下组件通讯的方法,并介绍一下依赖注入,希望对大家有所帮助! 1.  组件通讯 1.1  向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/c…

      2025年11月10日 web前端
      500
    • angular如何引入css

      angular引入css的方法:1、在ts文件中设置“@Component({styleUrls:[‘css文件路径’]})”语句;2、在ts文件中设置“@Component({styles:[`css样式代码`]})”语句。 本教程操作环境:windows7系统、angul…

      2025年11月10日 web前端
      100
    • 一起聊聊angular的样式隔离实现机制

      angular是怎么进行样式隔离的?下面本篇文章就来和大家一起聊聊angular的样式隔离实现机制,希望对大家有所帮助! angular 以组件为基本单位。我们编写一个一个的组件,再将这些组件组合为一颗组件树。但是在开发的过程中,经常需要在父组件中覆盖子组件的样式。比如现在我们有一个parent 组…

      2025年11月9日 web前端
      000
    • angular学习之浅析响应式表单

      本篇文章带大家继续angular的学习,了解一下angular中的响应式表单,介绍一下全局注册响应式表单模块、添加基础表单控件的相关知识,希望对大家有所帮助! 响应式表单 Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。【相关教程推荐:《angular教程》】 …

      2025年11月9日 web前端
      000
    • 浅析Angular+rxjs怎么实现拖拽功能?

      angular+rxjs怎么实现拖拽功能?下面本篇文章给大家介绍一下angular 结合 rxjs 实现拖拽的方法,希望对大家有所帮助! 在之前的文章,我们学习了 Angular 中自定义 Video 操作,没有度过的读者可先了解。 现在有这么一个需求,你会怎么实现呢? 页面中 video 标签,当…

      2025年11月9日 web前端
      000
    • Angular知识点分享:聊聊表单、管道、绑定、指令、通信和周期

      本篇文章给大家分享angular的一些知识点,介绍一下angular的两表单(模板驱动表单和响应式表单)、三管道(内置管道、链式管道、自定义管道)、三绑定、三指令、五通信、八周期,希望对大家有所帮助! 1 Angular的两大表单 1.1 模板驱动表单 ? 模板驱动表单:引入FormsModule模…

      2025年11月9日 web前端
      000
    • angular学习之聊聊指令和管道

      本篇文章带大家了解一下angular中的指令(directive)和管道(pipe),简单介绍一下相关知识点:内置指令和自定义指令,内置管道和自定义管道,希望对大家有所帮助! 指令 Directive 指令是 Angular 提供的操作 DOM 的途径。指令分为属性指令和结构指令。 属性指令:修改现…

      2025年11月9日 web前端
      100
    • angular学习之聊聊组件通讯和组件生命周期

      本篇文章带大家了解一下angular中的组件通讯和组件生命周期,简单介绍一下向组件内部传递数据、组件向外部传递数据的方法,希望对大家有所帮助! 组件通讯 1、向组件内部传递数据 // favorite.component.tsimport { Input } from ‘@angular/core’…

      2025年11月9日 web前端
      100
    • 什么是装饰器?聊聊Angular中怎么使用方法装饰器?

      什么是装饰器?本篇文章给大家介绍一下angular中使用方法装饰器的方法,希望对大家有所帮助! 方法装饰器并不是 Angular 的专属特性,在 es6 中也有着这种特性,本文主要是介绍 方法装饰器 在 Angular 中的使用。【相关教程推荐:《angular教程》】 什么是装饰器 在es6中,装…

      2025年11月9日 web前端
      000
    • 浅析Angular中的独立组件,看看怎么使用

      本篇文章带大家了解一下angular中的独立组件,看看怎么在angular中创建一个独立组件,怎么在独立组件中导入已有的模块,希望对大家有所帮助! Angular 14一项令人兴奋的特性就是Angular的独立组件终于来了。 在Angular 14中, 开发者可以尝试使用独立组件开发各种组件,但是值…

      2025年11月9日 web前端
      200
    • 聊聊Angular Route中怎么提前获取数据

      angular route中怎么提前获取数据?下面本篇文章给大家介绍一下从 angular route 中提前获取数据的方法,希望对大家有所帮助! 提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用 resolver, 在 Angula…

      2025年11月9日 web前端
      000
    • 项目过大怎么办?如何合理拆分Angular项目?

      angular项目过大,怎么合理拆分它?下面本篇文章给大家介绍一下合理拆分angular项目的方法,希望对大家有所帮助! Angular 让人诟病的一点就是打包后体积很大,一不小心 main.js就大的离谱,其实遇到类似的问题,不管是体积大、数据大、还是流量大,就一个思路:拆分。再配合浏览器的缓存机…

      2025年11月9日 web前端
      000
    • Angular中什么是结构指令?怎么使用?

      本篇文章带大家了解一下angular 中结构指令模式,介绍一下结构指令是什么且怎么使用,希望对大家有所帮助! 在 Angular 中,有两种类型的指令。属性指令修改 DOM 元素的外观或者行为。结构指令添加或者移除 DOM 元素。 结构指令是 Angular 中最强大的特性之一,然而它们却频繁被误解…

      2025年11月9日 web前端
      100
    • 聊聊自定义angular-datetime-picker格式的方法

      怎么自定义angular-datetime-picker格式?下面本篇文章聊聊自定义格式的方法,希望对大家有所帮助! 最近一直都在使用 Angular 进行开发,维护项目。遇到了日期的问题,同事采用的是 @danielmoncada/angular-datetime-picker。 PS:当然,如果…

      2025年11月9日 web前端
      000
    • angular学习之深入聊聊状态和动画

      本篇文章带大家深入了解一下angular中的状态和动画,简单介绍一下创建动画的方法,并聊聊关键帧动画、动画回调、可重用动画、交错动画等知识点,希望对大家有所帮助! 状态 1、什么是状态 状态表示的是要进行运动的元素在运动的不同时期所呈现的样式。 2、状态的种类 在 Angular 中,有三种类型的状…

      2025年11月9日 web前端
      000
    • Angular学习之ControlValueAccessor接口详解

      controlvalueaccessor 是什么?为什么需要使用 ?下面本篇文章就来带大家了解angular中的controlvalueaccessor组件接口,希望对大家有所帮助! ControlValueAccessor 是什么? 简单来说ControlValueAccessor是一个接口,它被…

      2025年11月9日 web前端
      000

    发表回复

    登录后才能评论
    关注微信