经过前面的学习,基本了解了Angular2.0的使用,所有的Module都是一个Component,甚至一个事件响应也是一个Component,或者表单验证也可以是一个Component。
Angular的运作机制图
添加Bootstrapping 组件
import {bootstrap} from 'angular2/angular2';
常见的模板语法
在Angular中 组件中的数据和Template中的表达式进行数据绑定,表达式可以是一个常量值 ,也可以是boolean表达式。
-
<input [value]="firstName">
绑定组件中的value属性到input的表达式firstName。 -
<div [attr.role]="myAriaRole">
绑定组件中对象的属性到html表达式myAriaRole -
<div [class.extra-sparkle]="hero === selectedHero">
----当hero === selectedHero
表达式为真时使用样式extra-sparkle。 -
<div [style.width.px]="mySize">
绑定样式的width属性到mysize(例如 10*20)表达式,单位是可选的。 -
<button (click)="readRainbow($event)">
绑定click事件,readRainbow($event)是组件中事件处理函数,$event是传入参数。 -
<div title="Hello {{ponyName}}">
将一个属性绑定到一个组件字符串变量 。 -
<p>Hello {{ponyName}}</p>
将文本内容绑定到一个组件字符串变量 -
<my-cmp [(title)]="name">
设置双向数据绑定 相当于<my-cmp [title]="name" (titleChange)="name=$event">
-
<video #movieplayer ...><button (click)="movieplayer.play()"></video>
创建一个本地变量movieplaye 用于接收当前模板中的数据绑定和事件绑定表达式中的视频元素实例 -
<p *myUnless="myExpression">...</p>
*
符号意味着将当前元素嵌入到模板myExpression
中,等价于<template [myUnless]="myExpression"><p>...</p></template>
-
<p>Card No.: {{cardNumber | myCreditCardNumberFormatter}}</p>
将表达式cardNumber
的值用myCreditCardNumberFormatter
格式化 -
<p>Employer: {{employer?.companyName}}</p>
"?"
表示当employer没有定义或者为空时忽略。
内置指令
内置指令导入的方式:import {NgIf,...} from 'angular2/common'
-
<section *ngIf="showSection">
根据表达式showSection删除或重新创建一个DOM树section元素 -
<li *ngFor="#item of list">
将li元素及其内容转为模板,并使用For循环显示列表中的每个项目。 -
switch指令
<div [ngSwitch]="conditionExpression"> <template [ngSwitchWhen]="case1Exp">...</template> <template ngSwitchWhen="case2LiteralString">...</template> <template ngSwitchDefault>...</template> </div>
根据表达式conditionExpression来判断嵌入哪个模板
-
选择样式指令
<div [ngClass]="{active: isActive,disabled: isDisabled}">
绑定一个存在的样式,右边map表达式运算结果例如这样
{active: true,disabled: false}
表单指令
导入方式:import {FORM_DIRECTIVES} from 'angular2/common'
<input [(ngModel)]="userName">
双向数据绑定。
类注解。
导入样式:import {Directive,...} from 'angular2/core'
-
注解当前类为一个组件
@Component({...}) class MyComponent() {}
-
注解一个管道组件
@Pipe({...}) class MyPipe() {}
-
注解一个Injectable组件,Injectable组件一般是服务类组件,单例模式。
@Injectable() class MyService() {}
组件配置
1.作用于组件视图范围 依赖注入的一组provider组件。
viewProviders: [MyService,provide(...)]
2.组件的内联模板/外部模板视图。
template: 'Hello {{name}}' templateUrl: 'my-component.html'
3.内联CSS样式/外部样式表的URL列表。
styles: ['.primary {color: red}'] styleUrls: ['my-component.css']
4.配置组件模板中使用的指令列表。
directives: [MyDirective,MyComponent]
5.配置组件的管道组件列表
pipes: [MyPipe,OtherPipe]
用于指令和组件类字段修饰符
-
@Input() myProperty
: -
@Output() myEvent = new EventEmitter()
: -
@HostBinding('[class.valid]') isValid
-
@HostListener('click',['$event']) onClick(e) {...}
监听主元素事件(如单击事件)通过指令/组件的方法(如onclick),可以传递一个参数($event)。
-
@ContentChild(myPredicate) myChildComponent
-
@ContentChildren(myPredicate) myChildComponents
-
@ViewChild(myPredicate) myChildComponent
-
@ViewChildren(myPredicate) myChildComponents
指令和组件变化检测和生命周期钩
-
constructor(myService: MyService,...) { ... }
-
ngOnChanges(changeRecord) { ... }
-
ngOnInit() { ... }
-
ngDoCheck() { ... }
-
ngAfterContentInit() { ... }
-
ngAfterContentChecked() { ... }
-
ngAfterViewInit() { ... }
-
ngAfterViewChecked() { ... }
当组件的视图校验完成后调用。仅适用于组件。
-
ngOnDestroy() { ... }
依赖注入配置
-
provide(MyService,{useClass: MyMockService})
设置或用Class类型的组件MyMockService重写MyService类的provide配置。
-
provide(MyService,{useFactory: myFactory})
设置或用Factory模式的组件myFactory重写MyService的provide配置。
-
provide(MyValue,{useValue: 41})
设置或MyValue设置值为41。
路由与导航
指令导入方式:
import {RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, ...} from 'angular2/router';
-
路由配置格式:
@RouteConfig([ { path: '/:myParam', component: MyComponent, as: 'MyCmp' }, { path: '/staticPath', component: ..., as: ...}, { path: '/*wildCardParam', as: ...} ]) class MyComponent() {}
-
<router-outlet></router-outlet>
使用当前组件激活的路由
-
<a [routerLink]="[ '/MyCmp',{myParam: 'value' } ]">
创建一个链接到一个不同的视图的,视图是基于路由指令组成的路由名称和可选参数。路由名称与配置路由的属性相匹配。以"/"为前缀表示从根路由访问,以"./"为前缀表示从子路由访问。
-
@CanActivate(() => { ... })class MyComponent() {}
-
routerOnActivate(nextInstruction,prevInstruction) { ... }
-
routerCanReuse(nextInstruction,prevInstruction) { ... }
路由器调用一个组件的routerCanReuse方法(如果定义了)来确定是否使用实例或销毁它并创建一个新的实例。应该返回一个布尔值或一个承诺。
-
routerCanDeactivate(nextInstruction,prevInstruction) { ... }
路由器调用每个组件的routerCanDeactivate方法(如果定义了),访问后将移除。如果所有这些方法返回的是true或者承诺,则表示访问已被处理。
-
routerOnDeactivate(nextInstruction,prevInstruction) { ... }