ngFor

news/2024/12/28 17:02:04/

在 angular2 里,我们介绍了一个新概念叫"structural directives",用来描述那些根据表达式在 DOM 上或增加、或删除元素的指令。和其他指令不同,"structural directive"要么作用在template tag上、 要么配合template attribute使用、要么前缀"*"作为简写语法糖。因为这个新语法特性,初学者常常犯错。

你能分辨出来以下错误么?

错误的 ngFor 用法

// a:
<div *ngFor="#item in items"><p> {{ item }} </p>
</div>// b:
<template *ngFor #item [ngForOf]="items"><p> {{ item }} </p>
</template>// c:
<div *ngFor="#item of items; trackBy=myTrackBy; #i=index"><p>{{i}}: {{item}} </p>
</div>

来,一步步解决错误

5a:把"in"换成"of"

// incorrect
<div *ngFor="#item in items"><p> {{ item }} </p>
</div>

如果有 AngularJS 1 经验,通常很容易犯这个错。在 AngularJS 1 里,相同的repeater写作 ng-repeat="item in items" 。

angular2 将"in"换成"of"是为了和ES6中的 for-of 循环保持一致。也需要记住的是,如果不用"*"语法糖,那么完整的repeater写法要写作 ngForOf , 而非 ngForIn

// correct
<div *ngFor="#item of items"><p> {{ item }} </p>
</div>

5b:语法糖和完整语法混着写

// incorrect
<template *ngFor #item [ngForOf]="items"><p> {{ item }} </p>
</template>

混着写是没必要的 - 而且事实上,这么写也不工作。当你用了语法糖(前缀"*")以后, angular2 就会把她当成一个template attribute,而不是一般的指令。具体来说,解析器拿到了 ngFor 后面的字符串, 在字符串前面加上 ngFor ,然后当作template attribute来解析。如下代码:

<div *ngFor="#item of items">

会被当成这样:

<div template="ngFor #item of items">

当你混着写时,他其实变成了这样:

<template template="ngFor" #item [ngForOf]="items">

从template attribute角度分析,发现template attribute后面就只有一个 ngFor ,别的什么都没了。那必然解析不会正确,也不会正常运行了。

如果从从template tag角度分析,他又缺了一个 ngFor 指令,所以也会报错。没了 ngFor 指令, ngForOf 都不知道该对谁负责了。

可以这样修正,要么去掉"*"写完整格式,要么就完全按照"*"语法糖简写方式书写

// correct
<template ngFor #item [ngForOf]="items"><p> {{ item }} </p>
</template>// correct
<p *ngFor="#item of items">{{ item }}
</p>

5c:在简写形式里用了错误的操作符

// incorrect
<div *ngFor="#item of items; trackBy=myTrackBy; #i=index"><p>{{i}}: {{item}} </p>
</div>

为了解释这儿到底出了什么错,我们先不用简写形式把代码写对了看看什么样子:

// correct
<template ngFor #item [ngForOf]="items" [ngForTrackBy]="myTrackBy" #i="index"><p> {{i}}: {{item}} </p>
</template>

在完整形式下,结构还是很好理解的,我们来试着分解一下:

  • 我们通过输入属性向 ngFor 里传入了两组数据:

    • 绑定在 ngForOf 上的原始数据集合 items

    • 绑定在 ngForTrackBy 上的自定义track-by函数

  • 用 # 声明了两个 local template variables ,分别是: #i 和 #item 。 ngFor 指令在遍历 items 时,给这两个变量赋值

    • i 是从0开始的 items 每个元素的下标

    • item 是对应每个下标的元素

当我们通过"*"语法糖简写代码时,必须遵守如下原则,以便解析器能够理解简写语法:

  • 所有配置都要写在 *ngFor 的属性值里

  • 通过 = 操作符设置 local variable

  • 通过 : 操作符设置input properties

  • 去掉input properties里的 ngFor 前缀,譬如: ngForOf ,就只写成 of 就可以了

  • 用分号做分隔

按照上述规范,代码修改如下:

// correct
<p *ngFor="#item; of:items; trackBy:myTrackBy; #i=index">{{i}}: {{item}}
</p>

分号和冒号其实是可选的,解析器会忽略它们。写上仅仅是为了提高代码可读性。因此,也可以再省略一点点:

// correct
<p *ngFor="#item of items; trackBy:myTrackBy; #i=index">{{i}}: {{item}}
</p>

http://www.ppmy.cn/news/908936.html

相关文章

【论文阅读】CVPR2018-深度材料感知跨光谱立体匹配

深度材料感知跨光谱立体匹配 摘要 跨光谱成像对识别和检测任务很有帮助。通常&#xff0c;多个相机用于跨光谱成像&#xff0c;因此需要图像对齐或双目系统中的视差估计。多相机跨光谱系统逐渐被嵌入到有源RGB-D设备中&#xff08;例如Kinect和iPhone X中的RGB-NIR相机&#…

FP-GNN a versatile deep learning architecture for enhanced molecular property prediction

FP-GNN a versatile deep learning architecture for enhanced molecular property prediction 基本信息 2022年9月17日&#xff0c;华南理工大学王领老师团队在Briefings in Bioinformatics上发表文章。基于分子指纹&#xff08;fingerprint&#xff0c;FP&#xff09;和图神…

fgh

foreach($v[name] as $key>$val){ $files[$i][name]$val; $files[$i][size]$v[size][$key];$files[$i][tmp_name]$v[tmp_name][$key]; $files[$i][error]$v[error][$key];$files[$i][type]$v[type][$key];$i; }

《论文阅读》FGN: Fully Guided Network for Few-Shot Instance Segmentation

留个笔记自用 FGN: Fully Guided Network for Few-Shot Instance Segmentation 做什么 Instance segmentation实例分割 目标检测&#xff08; Object detection&#xff09;不仅需要提供图像中物体的类别&#xff0c;还需要提供物体的位置&#xff08;bounding box&#xf…

frn

Filter Response Normalization 测试的比bn小,但是精度好像没有bn高 分1d 2d : 代码中有个错误,keepdims应该是keepdim https://github.com/tattaka/Filter-Response-Normalization-PyTorch/blob/master/filter_response_normalization/filter_response_normalize.py …

视频超分:DUF(Deep Video Super-Resolution Network Using Dynamic Upsampling Filters Without ...)

论文&#xff1a;基于 非动作补偿 动态上采样滤波器的深度视频超分网络 文章检索出处:2018 Conference on Computer Vision and Pattern Recognition(CVPR) Video Super-Resolution on Vid4 - 4x upscaling FRVSR:26.690 VSR-DUF:27.310 EDVR:27.350 RRN:27.690 (图像出自pape…

Feign

视频学习指路&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 Feign远程调用 之前利用RestTemplate发起远程调用的代码&#xff1a; //在service层&#xff0c;获取路径//2.1 url路径//Str…

FNN

FM(first-ordersecond-order)->DNN 网络结构 缺点&#xff1a; 不能对低阶特征拟合&#xff0c;需要预训练模型。