Angular2组件开发—模板的逻辑控制(三)

NgFor- 循环逻辑

如果希望利用一组可遍历的数据动态构造模板,那么应当使用NgFor指令。 例如示例中的EzStar组件,用来展示演员的作品列表:

迭代

NgFor指令应用在template元素上,对ngForOf属性指定的数据集中的每一项 实例化一个template的内容:

1 <template ng-for="" [ng-for-of]="items">
2     <li>----------</li>
3 </template>

如果items数据集有3条记录,那么会生成3个li对象,就像这样:

1 <li>----------</li>
2 <li>----------</li>
3 <li>----------</li>

不过这没多大用。

使用数据项

好在我们还可以为数据集的每一项声明一个局部变量,以便在模板内引用:

1 <template ng-for="" [ng-for-of]="items" #item="">
2     <li>{{item}}</li>
3 </template>

假如items数据集是一个数组:["China","India","Russia"],那么 现在生成的结果就有点用了:

1 <li>China</li>
2 <li>India</li>
3 <li>Russia</li>

使用数据项索引

有时还需要数据项在数据集中的索引,我们也可以为数据集的每一项的索引声明一个局部变量,以便在模板内引用:

1 <template ng-for="" [ng-for-of]="items" #item="" #i="index">
2     <li>[{{i+1}}] {{item}}</li>
3 </template>

现在生成的结果更规矩了:

1 <li>[1] China</li>
2 <li>[2] India</li>
3 <li>[3] Russia</li>

语法糖

与NgIf类似,Angular2也为NgFor提供了两种语法糖:

1 //使用template attribute
2 <any template="ng-for #item of items;#i=index">...</any>
3 //使用*前缀
4 <any *ng-for="#item of items;#i=index">...</any>

毫无疑问,应当尽量使用*ng-for的简便写法,这可以提高模板的可读性

例如:

 1 <!doctype html>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <title>NgFor</title>
 6     <script type="text/javascript" src="lib/[email protected]"></script>
 7     <script type="text/javascript" src="lib/angular2.dev.js"></script>
 8     <script type="text/javascript" src="lib/system.config.js"></script>
 9 </head>
10 <body>
11     <ez-app></ez-app>
12     <script type="module">
13         //引入NgSwitch类型
14         import {Component,View,bootstrap,NgFor} from "angular2/angular2";
15
16         @Component({selector:"ez-app"})
17         @View({
18             directives:[EzStar],
19             template:`
20                 <ez-star></ez-star>
21             `
22         })
23         class EzApp{}
24
25         @Component({
26             selector : "ez-star"
27         })
28         @View({
29             directives:[NgFor],
30             template : `
31                 <div>
32                     <h2>{{actor}} - Films</h2>
33                     <ul>
34                         <li *ng-for="#film of films;#i=index">[{{i+1}}]{{film}}</li>
35                     </ul>
36                 </div>
37             `
38         })
39         class EzStar{
40             constructor(){
41                 this.actor = "Jason Statham";
42                 this.films = [
43                     "Mechanic: Rescurrection / 2016",
44                     "Spy / 2015",
45                     "Furious 7 /2015",
46                     "Wild Card / 2015",
47                     "The Expendables / 2014",
48                     "Home Front / 2013",
49                     "Hummingbird / 2013",
50                     "Fast & Furious 6 / 2013",
51                     "Parker / 2013"
52                 ];
53             }
54         }
55
56         bootstrap(EzApp);
57     </script>
58 </body>
59 </html>

结果如下:

时间: 2024-10-14 13:30:58

Angular2组件开发—模板的逻辑控制(三)的相关文章

Angular2组件开发—模板的逻辑控制(二)

使用分支逻辑 如果组件的模板需要根据某个表达式的不同取值展示不同的片段,可以使用NgSwitch系列指令来动态切分模板.比如右边示例中的广告组件EzPromotion,需要根据来访者性别的不同推送不同的广告: NgSwitch包含一组指令,用来构造包含多分支的模板: NgSwitch NgSwitch指令可以应用在任何HTML元素上,它评估元素的ngSwitch属性值,并根据这个值 决定应用哪些template的内容(可以同时显示多个分支): 1 <any [ng-switch]="exp

Angular2组件开发—模板语法(二)

directives - 使用组件 在Angular2中,一个组件的模板内除了可以使用标准的HTML元素,也可以使用自定义的组件! 这是相当重要的特性,意味着Angular2将无偏差地对待标准的HTML元素和你自己定义的组件.这样, 你可以建立自己的领域建模语言了,这使得渲染模板和视图模型的对齐更加容易,也使得模板的语义性 更强: 声明要在模板中使用的组件 不过,在使用自定义组件之前,必需在组件的ViewAnnotation中通过directives属性声明这个组件: 1 @View({ 2 d

Angular2组件开发—模板语法(六)

#var - 局部变量 有时模板中的不同元素间可能需要互相调用,Angular2提供一种简单的语法将元素 映射为局部变量:添加一个以#或var-开始的属性,后续的部分表示变量名, 这个变量对应元素的实例. 在下面的代码示例中,我们为元素h1定义了一个局部变量v_h1,这个变量指向 该元素对应的DOM对象,你可以在模板中的其他地方调用其方法和属性: 1 @View({ 2 template : ` 3 <h1 #v_h1>hello</h1> 4 <button (click)

Angular2组件开发—调用服务(三)

注入一个复杂的服务 EzAlgo相当简单,使用new或者使用Injector来获得一个实例看起来差别不大.那如果我们的EzApp组件要使用Http服务呢? 第一眼看上去,Http服务显然是一个真正有用的服务 - 因为看起来相当的复杂 - Http依赖于XHRBackend和BaseRequestOptions,而XHRBackend又依赖于BrowserXHR. 我们可以有两种方法获得一个Http的实例,以便通过它获得网络访问的功能: 1. 使用new进行实例化 如果我们使用传统的new方式创建

Angular2组件开发—模板语法(五)

(event) - 监听事件 在模板中为元素添加事件监听很简单,使用一对小括号包裹事件名称,并绑定 到表达式即可: 上面的代码实例为DOM对象h1的click事件添加监听函数onClick(). 另一种等效的书写方法是在事件名称前加on-前缀: 1 @View({template : `<h1 on-click="onClick()">HELLO</h1>`}) 例如: 1 <!doctype html> 2 <html> 3 <h

Angular2组件开发—为模板应用样式

styles - 设置模板样式 组件既然处于UI层,就应当好看些,好看是构造良好用户体验的一部分.Angular2的 组件模板基于HTML,那么显然,我们需要通过样式表/CSS来调整组件的外观. 和模板类似,我们有两种方法为组件设置CSS样式: 1. 内联样式 可以使用组件View注解的styles属性来设置内联样式: 1 @View({ 2 styles:[` 3 h1{background:#4dba6c;color:#fff} 4 `] 5 }) 2. 外部样式 也可以把样式定义在单独的文

Angular2组件开发—为模板应用样式(二)

ShadowDom - 封装私有样式 Angular2采用ShadowDom作为组件的渲染基础,这意味着组件被渲染到独立的Shadow Tree上,这很好,可以实现DOM对象和样式的良好封装: 但问题是,除了Chrome之外的大多数的浏览器目前还不支持ShadowDom,因此,Angular2 提供了三种将模板渲染到DOM的策略. 以下面的模板为例,我们看三种策略下的渲染结果差异: 1 @View{ 2 template:"<h1>hello</h1>", 3

Angular2组件开发—表单输入(三)

NgControlGroup - 命名控件组 NgControlGroup指令的选择符是[ng-control-group],如果模板中的某个元素具有这个属性, Angular2框架将自动创建一个控件组对象,并将这个对象以指定的名称与DOM对象绑定. 控件组可以嵌套,方便我们在语义上区分不同性质的输入: 和NgControlName指令一样,NgControlGroup指令也必须作为NgForm或NgFormModel的 后代使用,因为这个指令需要将创建的控件组对象添加到祖先(NgForm或Ng

Angular2组件开发—属性与事件(一)

属性声明 - 暴露成员变量 属性是组件暴露给外部世界的调用接口,调用者通过设置不同的属性值来定制 组件的行为与外观: 在Angular2中为组件增加属性接口非常简单,只需要在Component注解的properties属性中声明组件的成员变量就可以了: 1 //EzCard 2 @Component({ 3 properties:["name","country"] 4 }) 上面的代码将组件的成员变量name和country暴露为同名属性,这意味着在EzApp的模