iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Angular中利用模板输入变量
  • 766
分享到

怎么在Angular中利用模板输入变量

2023-06-14 23:06:19 766人浏览 泡泡鱼
摘要

这篇文章给大家介绍怎么在angular中利用模板输入变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。@Component({  selector: 'nz-demo-pagina

这篇文章给大家介绍怎么在angular中利用模板输入变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

@Component({  selector: 'nz-demo-pagination-item-render',  template: `    <nz-pagination [nzPageIndex]="1" [nzTotal]="500" [nzItemRender]="renderItemTemplate"></nz-pagination>    <ng-template #renderItemTemplate let-type let-page="page">      <ng-container [ngSwitch]="type">        <a *ngSwitchCase="'page'">{{ page }}</a>        <a *ngSwitchCase="'prev'">Previous</a>        <a *ngSwitchCase="'next'">Next</a>        <a *ngSwitchCase="'prev_5'"><<</a>        <a *ngSwitchCase="'next_5'">>></a>      </ng-container>    </ng-template>  `})export class NzDemoPaginationItemRenderComponent {}

看完这个之后我就很是疑惑,这个let是啥,为啥let-跟上一个变量之后就有值了呢?然后我就开始在官网中找这个let是什么东西。最终,我在主要概念-指令-结构性指令微语法一节找到了关于let的说明。官网描述:微语法。【相关推荐:《angular教程》】

在下面还有一段简短的说明:

模板输入变量(Template input variable)

模板输入变量是这样一种变量,你可以在单个实例的模板中引用它的值。 这个例子中有好几个模板输入变量:heroiodd。 它们都是用 let 作为前导关键字。

......

你使用 let 关键字(如 let hero)在模板中声明一个模板输入变量。 这个变量的范围被限制在所重复模板的单一实例上。 事实上,你可以在其它结构型指令中使用同样的变量名。

......

官网还是一如既往的不说人话,短短几句话就给你介绍完了,也不告诉你这玩意怎么用,也不告诉你let声明的变量的值到底是从哪里来的。我越看越气,得,官网你不说,我自己找。

先说一个粗略的结论:let声明的变量是这个template模板的上下文对象中的变量。不然为啥叫模板输入变量呢。在*ngFor内幕这小节中,我们了解到了其内幕,结构性指令其实就是将宿主元素包裹在一个<ng-template></ng-template>中,然后在这个模板上将*ngFor中的表达式解析成一个个的let模板输入变量和这个指令需要传入的值。由于模板中代码并不会直接被渲染成视图,所以一定需要某种方法来使模板变成视图。我们的结构性指令就是干这个事的,就是将我们的模板变成视图。

*ngFor的官方示例代码如下:

//解析前的模板<div *ngFor="let hero of heroes; let i=index; let odd=odd; trackBy: trackById" [class.odd]="odd">  ({{i}}) {{hero.name}}</div>//angular解析后的模板<ng-template ngFor let-hero [ngForOf]="heroes" let-i="index" let-odd="odd" [ngForTrackBy]="trackById">  <div [class.odd]="odd">({{i}}) {{hero.name}}</div></ng-template>
  • 在此提示一下,所谓的宿主元素就是指令所在的那个元素,像上面的例子中,div就是*ngFor指令的宿主元素。

  • trackBy这个类似于VueReact中的key。可以给模板一个标识,使其重新渲染的时候性能开销降低一些。

然后我们再看官网说的:

  • let-ilet-odd 变量是通过 let i=indexlet odd=odd 来定义的。 Angular 把它们设置为上下文对象中的 indexodd 属性的当前值。

  • 这里并没有指定 let-hero 的上下文属性。它的来源是隐式的。 Angular 将 let-hero 设置为此上下文中 $implicit 属性的值, 它是由 NgFor 用当前迭代中的英雄初始化的。

看完这段描述,我们可以得知:angular为这个模板设置了上下文对象。但是我们看不到这个过程,因为这是在ngFor源码内部实现的。并且这个上下文对象具备indexodd属性,并且包含一个$implicit(implicit:含蓄的;不直接言明的)的属性。那么我们推断这个上下文对象至少有以下几个属性:

{    $implicit:null,    index:null,    odd:null,}

那么我们声明let变量的本质其实就是声明一个变量获取上下文对象中的同名属性的值let-hero不进行任何赋值的话,hero默认等于$implicit的值。无论是有多少个let-alet-blet-c还是let-me。声明的这个变量的值都等于$implicit的值。而我们进行赋值过的,比如let-i = "index"i的值就等于这个上下文对象中的index属性对应的值。

上下文对象是如何设置的

当我们知道这个上下文对象是什么了,就该想这个上下文对象是怎么设置的了

结构性指令这一节当中,我们跟着官方示例做了一遍这个自定义结构性指令(如果还没有做的话,建议先跟着做一遍)。在UnlessDirective这个指令中,其构造器constructor声明了两个可注入的变量,分别是TemplateRefViewContainerRef。官网给的解释我觉得太过晦涩难懂,我这里给出一下我自己的理解:TemplateRef代表的是宿主元素被包裹之后形成的模板的引用。而ViewContainerRef代表的是一个视图容器的引用。那么问题来了,这个视图容器在哪儿呢?我们在constructor构造器中打印一下ViewContainerRef。打印结果如图:

怎么在Angular中利用模板输入变量

然后我们点进去这个comment元素。发现其就是一个注释元素。如图所示:

怎么在Angular中利用模板输入变量

其实我也不是很确定这个视图容器到底是不是这个注释元素。但是毋庸置疑的是,视图容器和宿主元素是兄弟关系,紧挨着宿主元素。我们可以使用ViewContainerRef中的createEmbeddedView() 方法(Embedded:嵌入式,内嵌式),将templateRef模板引用传入进去,创建出来一个真实的视图。由于这个视图是被插入到视图容器ViewContainerRef中了,所以又叫内嵌视图。那么这又和我们的上下文对象有什么关系呢?其实createEmbeddedView这个方法不止一个参数,其第二个参数就是给我们的模板设置上下文对象的。api的详情介绍请看createEmbeddedView这个API的详情。

怎么在Angular中利用模板输入变量

就这样。我们就可以将上下文对象塞入模板中了,这样的话我们也可以直接使用let声明变量的方法来使用这个上下文对象了。

自定义一个简单的类*ngFor指令——appRepeat

那么我们知道是如何设置的了,那么我们就来验证一下是否是对的。接下来,我们仿照ngfor的功能,自己写一个简单的渲染指令。

首先我们定义一个指令:RepeatDirective。代码如下:

@Directive({  selector: '[appRepeat]',})export class RepeatDirective {  constructor(    private templateRef: TemplateRef<any>,    private viewContainer: ViewContainerRef,  ) { }  @Input() set appRepeatOf(heroesList: string[]) {    heroesList.forEach((item, index, arr) => {      this.viewContainer.createEmbeddedView(this.templateRef, {        //当前条目的默认值        $implicit: item,        //可迭代对象的总数        count: arr.length,        //当前条目的索引值        index: index,        //如果当前条目在可迭代对象中的索引号为偶数则为 true。        even: index % 2 === 0,        //如果当前条目在可迭代对象中的索引号为奇数则为 true。        odd: index % 2 === 1,      });    });  }}

然后我们将其导入NgModule中,这个过程就省略不写了。然后我们在组件中使用一下这个指令:

@Component({  selector: 'app-structural-likeNgFor-demo',  template: `    <h3>原神1.5版本卡池角色</h3>    <h5>自定义ngFor(appRepeat)</h5>    <ul>      <li *appRepeat="let h of heroesList;let i = index;let even = even">        索引:{{i}} -- {{h}} -- 索引值是否是偶数:{{even.toString()}}      </li>    </ul>    <h5>真正的ngFor</h5>    <ul>      <li *ngFor="let h of heroesList;let i = index;let even = even">        索引:{{i}} -- {{h}} -- 索引值是否是偶数:{{even.toString()}}      </li>    </ul>  `,})export class StructuralLikeNgForDemoComponent {  public heroesList: string[] = ['钟离', '烟绯', '诺艾尔', '迪奥娜'];}

在这里需要注意的是指令中的appRepeatOf不是乱写的。在微语法的解析过程中let h of heroesList中的of首先首字母会变成大写的,变成Of。然后在给它加上这个指令的前缀,也就是appRepeat。组合起来就是appRepeatOf了。由它来接收一个可迭代的对象。

最后显示的效果图:

怎么在Angular中利用模板输入变量

关于怎么在Angular中利用模板输入变量就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在Angular中利用模板输入变量

本文链接: https://www.lsjlt.com/news/275767.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Angular中利用模板输入变量
    这篇文章给大家介绍怎么在Angular中利用模板输入变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。@Component({  selector: 'nz-demo-pagina...
    99+
    2023-06-14
  • Angular中的模板引用变量有什么作用
    这篇文章主要介绍了Angular中的模板引用变量有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular中的模板引用变量有什么作用文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • Angular如何利用内容投射向组件输入ngForOf模板
    这篇文章主要介绍了Angular如何利用内容投射向组件输入ngForOf模板,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。现在,我们写一个组...
    99+
    2024-04-02
  • 怎么在Django模板中运算变量
    本篇文章给大家分享的是有关怎么在Django模板中运算变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。#加法:{{value|add:value2}}#返回的结果是value...
    99+
    2023-06-14
  • angular中的组件模板怎么用
    这篇文章主要介绍“angular中的组件模板怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“angular中的组件模板怎么用”文章能帮助大家解决问题。Angul...
    99+
    2024-04-02
  • Angular模板引用变量及其作用域的示例分析
    小编给大家分享一下Angular模板引用变量及其作用域的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Angular模板引用变量如果你曾经参与过Angular项目的开发,那么你可能...
    99+
    2024-04-02
  • angular中怎么实现输入与输出
    本篇文章给大家分享的是有关angular中怎么实现输入与输出,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。组件的输入angular允许使用两种...
    99+
    2024-04-02
  • MySQL怎么注入利用的变量
    这篇文章主要介绍“MySQL怎么注入利用的变量”,在日常操作中,相信很多人在MySQL怎么注入利用的变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL怎么注入利用的...
    99+
    2024-04-02
  • Shell脚本中怎么判断输入变量
    Shell脚本中怎么判断输入变量,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.判断变量代码如下:read -p "input a word :" wor...
    99+
    2023-06-09
  • 怎么在java中利用继承访问变量
    今天就跟大家聊聊有关怎么在java中利用继承访问变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
    99+
    2023-06-14
  • 无法使用 Go 的“文本/模板”库导入变量
    偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《无法使用 Go 的“文本/模板”库导入变量》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我...
    99+
    2024-04-04
  • 怎么在Android开发中模拟输入
    这篇文章给大家介绍怎么在Android开发中模拟输入,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。input 指令我们打开adb,进入shell,输入input可以看到指令的参数说明。其中source一般都是用的默认值...
    99+
    2023-06-14
  • python多个变量怎么一次输入
    在Python中,可以使用input函数一次性输入多个变量。输入的多个变量可以用空格、逗号或其他分隔符分隔。然后可以使用split(...
    99+
    2023-10-18
    python
  • 怎么在Android应用中利用EditText禁止在输入框中输入空格与特殊字符
    今天就跟大家聊聊有关怎么在Android应用中利用EditText禁止在输入框中输入空格与特殊字符,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体实现如下: public stat...
    99+
    2023-05-31
    edittext android roi
  • .nec# 中怎么利用textbox输入数字
    本篇文章为大家展示了.nec# 中怎么利用textbox输入数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。当界面上要用户输入只有数字的字符时,默认的c# textbox数字是不能胜任的,网上有很...
    99+
    2023-06-17
  • C# 中怎么利用TextBox输入数字
    C# 中怎么利用TextBox输入数字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、重写键盘事件OnKeyPress()键盘输入的字符可以通过重写c# te...
    99+
    2023-06-17
  • 怎么在java中利用全局变量终止线程
    这期内容当中小编将会给大家带来有关怎么在java中利用全局变量终止线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-15
  • Android中怎么利用EditText输入表情
    Android中怎么利用EditText输入表情,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、简介editText是TextView的子类,TextView能用的工具Edi...
    99+
    2023-05-30
    edittext android
  • Angular不要在模板中调用方法的原因有哪些
    这篇文章主要介绍Angular不要在模板中调用方法的原因有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在运行 ng generate component <compone...
    99+
    2024-04-02
  • java中怎么用println输出两个变量
    在Java中,可以使用`println`方法来输出两个变量。下面是一种常见的方式: int num1 = 10; int num2 ...
    99+
    2023-10-27
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作