Angular2 内置指令 NgFor 和 NgIf 详解
http://www.jb51.net/article/89781.htm
在这一章节中,我们来学习如何使用Angular2来展示数据,以及如何使用它的内置指令NgFor和NgIf
首先要确保你有一个可以运行起来的Angular2的样例程序,最好就是我们上一章节中完成的那个QuickStart小项目或者你自己根据官网上面的步骤完成的QuickStart小项目,因为我们的讲解都是在那个基础上来进行的;然后让我们开始下面的快乐旅程吧.
因为我们的这一系列的文章都是使用的Typescript所以在看下面的内容之前你最好可以看一下Typescript或者ES6的类,它们的网址分别是Typescript,ES6;如果以前你学过Java或者C++这种类似的面向对象的语言的话,那么学习这里的类就很轻松了;这里面的类基本上和那些语言中的类是相似的.
上一节中我们在app.component.ts中导出了一个空的类,那么下面我们就要开始填充它,让它变得丰满起来.首先我们给这个AppComponent类(组件)添加三个属性,分别是name,age,fruit;就像下面这样:
| 
 1 
2 
3 
4 
5 
 | 
export class AppComponent {   username = 'dreamapple';   age = 22;   fruit = 'apple'} | 
上面的写法其实只是一种简写的形式,实际上完整的写法应该是这样的:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
 | 
export class AppComponent {   //username = 'dreamapple';   //age = 22;   //fruit = 'apple'   username: string;   age: number;   fruit: string;     constructor() {     this.username = 'dreamapple';     this.age = 22;     this.fruit = 'apple';   } } | 
然后我们要修改我们的模板了,因为我们在模板中要使用较多的HTML,所以我们要使用反引号来包裹住我们的HTML片段;我们的装饰器函数如下所示:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Component({   selector: 'my-app',   template:`     <p>My name is: {{username}}</p>     <p>My age is: {{age}}</p>     <p>My favorite fruit is: {{fruit}}</p>   ` }) | 
当然我们也可以使用装饰器函数中元数据对象的templateUrl配置选项,如下所示:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
@Component({   selector: 'my-app',   //template:`   //  <p>My name is: {{username}}</p>   //  <p>My age is: {{age}}</p>   //  <p>My favorite fruit is: {{fruit}}</p>   //`,   templateUrl: 'app/templates/app-template.html'}) | 
其中app/templates/app-template.html表示的是程序的根目录app(而不是angular2-travel)下的templates文件夹下的app-template.html文件,然后将我们之前写的HTML片段复制过去就好了.
从上面的过程中,我们可以看到Angular2显示数据依然使用的是Angular1惯用的双大括号;它作为一个插值符号,在这个插值符号出现的地方就是我们要显示的数据的地方.接下来我们要学习使用NgFor这个内置指令了,熟悉Angular1的同学应该很容易就上手这个指令,因为NgFor和ng-repeat基本是一样的;它用来循环一个可迭代的对象,一般情况下会是一个数组.
接下来我们给AppComponent再添加一个属性fruitsList,如下所示:
| 
 1 
2 
3 
4 
5 
6 
 | 
export class AppComponent {   username = 'dreamapple';   age = 22;   fruitsList = ['apple', 'orange', 'pear', 'banana'];   fruit = this.fruitsList[0]; // 这里要使用 this.fruitsList[0] } | 
我们需要注意的地方是那个有注释的地方,我们必须使用this.fruitsList来指代上面我们已经定义好的属性,如果使用fruitsList的话,Angular就不知道它表示是什么.
接下来我们要循环这个水果数组了,看看如何在模板中表示吧.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
 | 
@Component({   selector: 'my-app',   template:`     <p>My name is: {{username}}</p>     <p>My age is: {{age}}</p>     <ul>       <li *ngFor="let fruit of fruitsList">{{fruit}}</li>     </ul>     <p>My favorite fruit is: {{fruit}}</p>   ` }) | 
上面的代码中有几个地方是需要注意的地方,首先我们使用了*ngFor而不是ngFor,这里的*是不能够去掉的;如果去掉的话那么我们的程序不会报错,但是我们只循环出来了数组的第一项.关于为何要加*,你可以详细的看看这里模板语法;当然我们可以在*ngFor表达式的后面写一些能够帮助我们展示每一项索引的操作,可以像下面这样:
<li *ngFor="let fruit of fruitsList; let i =
index;">{{i}}-{{fruit}}</li>
上面的模板代码有一些需要注意的地方,首先要知道*ngFor后面跟的是表达式,所以我们可以写一些简单的表达式,帮助我们更好地进行循环;还有我们使用了let关键词,增加了块级作用域,使我们的这些变量都限定在*ngFor这个循环块中.好啦,如果你想更多地了解*ngFor,你可以看一下官方关于NgFor的API.
接下来要介绍的这个指令是NgIf,当然这个指令和Angular1的ng-if指令基本上是相似的,根据后面表达式的值决定要不要在DOM上添加或者移除一个元素.
看看我们是如何在模板使用这个指令的:
<p *ngIf="fruitsList.length > 3">fruitsList's length is bigger than
3</p>
<p *ngIf="fruitsList.length <= 3">fruitsList's length is
not bigger than
3</p>
首先要指出的是,和使用*ngFor一样,我们使用了*ngIf;然后我们可以在*ngIf后面写上一个表达式,这个表达式被期望的返回结果是Boolean类型的值;然后*ngIf指令会根据这个表达式的值决定要不要在DOM上添加或者移除它掌控的这个元素.
既然我们使用了Typescript,我们就可以使用很多新的特性,比如说使用类去构建实例;接下来我们来使用Fruit类来构建我们的水果实例.首先我们在app文件夹下创建一个新的文件夹,就叫它classes吧,然后我们创建一个Fruit.ts文件,在这里面我们书写Fruit类的代码:
| 
 1 
2 
3 
4 
5 
6 
 | 
export class Fruit{   constructor(     public name:string,     public price: number   ){} } | 
解释一下上面的代码,我们使用了构造函数,然后在构造函数里面声明了这个对象的两个属性;一个是name,另一个是price,我们使用构造函数里面的name:string,和price:
number参数来创建和初始化这个对象的属性.接下来我们就可以在我们的程序中使用这个类了;
首先在app.component.ts中引入这个类:
import {Fruit} from
'./classes/Fruits';
然后在AppComponent中使用Fruit类来初始化我们的水果列表:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
 | 
export class AppComponent {   username = 'dreamapple';   age = 22;   fruitsList = [     new Fruit('apple', 20),     new Fruit('orange', 30),     new Fruit('pear', 40),     new Fruit('banana', 50)   ];   //noinspection TypescriptUnresolvedVariable   fruit = this.fruitsList[0].name; // 这里要使用 this.fruitsList[0] } | 
然后也要改一下我们的模板:
代码如下:
i = index;">{{i}}-{{fruit.name}}-{{fruit.price}}</li>
最后的结果应该是下面这个样子:

最后不得不说,无论是ES6,还是Typescript都让我感觉到了有种写Java感觉;这也算有利有弊吧,好处肯定是增加了代码的可读性,使程序更加容易维护,也更容易写出大型的项目,让团队协作也非常的便利;当然也有它的一些不足,不足主要是增加了大家的学习成本;当然一切向前看呀.
如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区
您可能感兴趣的文章:
Angular2 内置指令 NgFor 和 NgIf 详解的更多相关文章
- PHP使用内置函数生成图片的方法详解
		
原文地址:http://www.poluoluo.com/jzxy/201605/475301.html 本文实例讲述了PHP使用内置函数生成图片的方法.分享给大家供大家参考,具体如下: 第一步:创建 ...
 - Win7下的内置FTP组件的设置详解
		
在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FTP组件.故FTP的设置第一步就是安装F ...
 - [Form Builder]内置函数execute_trigger、do_key详解
		
转:http://yedward.net/?id=82 1.execute_trigger:用来运行一个指定的触发器,常用来运行用户自定义的触发器. 语法:procedure execute_trig ...
 - Java多线程之syncrhoized内置互斥锁的用法详解
		
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827547.html 解决并行冲突最有效的方法就是加同步锁,主要有以下几种方法: 1:动态方法 ...
 - 浅谈Angularjs至Angular2后内置指令的变化
		
一.科普概要说明 我们常说的 Angular 1 是指 AngularJS: 从Angular 2 开始已经改名了.不再带有JS,只是单纯的 Angular: Angular 1.x 是基于JavaS ...
 - vue内置指令详解——小白速会
		
指令 (Directives) 是带有 v- 前缀的特殊属性,职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 内置指令 1.v-bind:响应并更新DOM特性:例如:v-bi ...
 - ng-book札记——内置指令
		
Angular提供了一些内置指令(directive),这些添加在HTML元素(element)上的特性(attribute)可以赋予更多的动态行为. NgIf ngIf指令用于在某个条件下显示或者隐 ...
 - [转] Angular 4.0 内置指令全攻略
		
[From] https://segmentfault.com/a/1190000010416792 简书链接 在这篇文章中,我们将分别列举每一个内置指令的用法,并提供一个例子作为演示.尽量用最少最简 ...
 - angular内置指令相关知识
		
原文地址 https://www.jianshu.com/p/5a5b43a8e91f 大纲 1.angular指令的分类 2.angular指令之——组件 3.angular指令之——属性指令 (n ...
 
随机推荐
- nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c
			
首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free. /* * Copyright (C) Igor Sys ...
 - Appium+python自动化-Remote远程控制
			
前言 在第三篇启动app的时候有这样一行代码driver = webdriver.Remote('http://192.168.1.1:4723/wd/hub', desired_caps),很多小伙 ...
 - WebSocket 教程(转载)
			
WebSocket 教程 作者: 阮一峰 日期: 2017年5月15日 WebSocket 是一种网络通信协议,很多高级功能都需要它. 本文介绍 WebSocket 协议的使用方法. 一.为什么需 ...
 - Boost::lexical_cast类型转换
			
1.字符串->数值 C++代码 #include <boost/lexical_cast.hpp> #include <iostream> int main() { us ...
 - [C++] Variable/Hex conversion
			
程序编译链接原理预处理:.c -> .i gcc -E hello.c -o hello.i 编译:.i / .c -> .sgcc -S hello.i -o hello.s 汇编:.s ...
 - Verifying Package Integrity Using MD5 Checksums or GnuPG
			
In this note, I reference the MySQL manual file. After downloading the MySQL package that suits your ...
 - EZOJ #227
			
传送门 分析 我们发现第一段数和最后一段数对答案的贡献系数为1/-1,其余为0/2/-2 而且对于相邻两段不能系数均非0 于是可以dp 代码 #include<iostream> #inc ...
 - [转]Python-__builtin__与__builtins__的区别与关系(超详细,经典)
			
在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...
 - 往数据库添加的时候(只添加以前未添加的记录的写法)c#
			
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
 - javascript -window与document 待整理
			
window对象和document对象的区别一般来讲,一个window里就是一个document,但是,iframe里面也可以装个document,在iframe里面就有区别了 alert(docum ...