看這篇文章基本明白怎麼渲染模板,可是個人工程會報錯說#號非法,這篇的寫法也很差用。css
angular2.0.0的語法集:html
Angular for TypeScript 語法快速指南 (基於2.0.0版本)
引導
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
nodeplatformBrowserDynamic().bootstrapModule(AppModule);
使用JIT編譯器引導一個AppModule模塊定義的應用webpack
NgModules
import { NgModule } from '@angular/core';
web@NgModule({ declarations: ..., imports: ...,
exports: ..., providers: ..., bootstrap: ...})
class MyModule {}定義一個模塊,其中包括組件、指令、管道和提供商。ajax
declarations: [MyRedComponent, MyBlueComponent, MyDatePipe]
一個數組,包括從屬於當前模塊的組件、指令和管道。bootstrap
imports: [BrowserModule, SomeOtherModule]
一個數組,包括被導入到當前模塊中的全部模塊。來自被導入模塊的
declarations
也一樣對當前模塊有效。數組exports: [MyRedComponent, MyDatePipe]
一個數組,包括對導入當前模塊的模塊可見的組件、指令、管道。安全
providers: [MyService, { provide: ... }]
一個數組,包括在對前模塊及導入當前模塊的模塊中的內容物(組件、指令、管道、提供商等)可見的依賴注入提供商。angular2
bootstrap: [MyAppComponent]
一個數組,包括由當前模塊引導時應該引導的組件
模板語法 <input [value]="firstName">
把屬性
value
綁定到表達式firstName
的結果。<div [attr.role]="myAriaRole">
把
role
這個Attribute綁定到表達式myAriaRole
的結果。<div [class.extra-sparkle]="isDelightful">
把元素是否出現CSS類
extra-sparkle
,綁定到一個表達式isDelightful
的結果是否爲真。<div [style.width.px]="mySize">
把樣式的
width
屬性綁定到表達式mySize
的結果,以px爲單位。這個單位是可選的。<button (click)="readRainbow($event)">
當按鈕(及其子元素)上的click事件被觸發時,調用
readRainbow
方法,並把事件對象做爲參數傳入。<div title="Hello {{ponyName}}">
把屬性綁定到一個插值表達式字符串,好比 "Hello Seabiscuit"。它等價於:
<div [title]="'Hello ' + ponyName">
<p>Hello {{ponyName}}</p>
把文本內容綁定到一個插值表達式,好比 "Hello Seabiscuit".
<my-cmp [(title)]="name">
設置雙向數據綁定。等價於:
<my-cmp [title]="name" (titleChange)="name=$event">
<video #movieplayer ...>
<button (click)="movieplayer.play()">
</video>建立一個局部變量
movieplayer
,它提供到video
元素實例的訪問,可用於當前模板中的數據綁定和事件綁定表達式中。<p *myUnless="myExpression">...</p>
*
符號表示當前元素將被轉變成一個內嵌模板。等價於:<template [myUnless]="myExpression"><p>...</p></template>
<p>Card No.: {{cardNumber | myCardNumberFormatter}}</p>
經過名叫
myCardNumberFormatter
的管道,轉換表達式的當前值cardNumber
。<p>Employer: {{employer?.companyName}}</p>
安全導航運算符(
?.
)表示employer
字段是可選的,若是它是undefined
,表達式剩下的部分將被忽略<svg:rect x="0" y="0" width="100" height="100"/>
SVG模板須要在它們的根節點上帶一個
svg:
前綴,以消除模板中HTML元素和SVG元素的歧義。<svg>
<rect x="0" y="0" width="100" height="100"/>
</svg>
<svg>
元素在無需前綴的狀況下,也能被自動檢測爲SVG。
內置指令
import { CommonModule } from '@angular/common';
<section *ngIf="showSection">
基於showSection表達式的值移除或從新建立部分DOM樹。
<li *ngFor="let item of list">
把li元素及其內容轉化成一個模板,並用它來爲列表中的每一個條目初始化視圖。
<div [ngSwitch]="conditionExpression">
<template [ngSwitchCase]="case1Exp">...</template>
<template ngSwitchCase="case2LiteralString">...</template>
<template ngSwitchDefault>...</template>
</div>基於conditionExpression的當前值,從內嵌模板中選取一個,有條件的切換div的內容。
<div [ngClass]="{active: isActive, disabled: isDisabled}">
把一個元素上CSS類的出現與否,綁定到一個真值映射表上。右側的表達式應該返回相似{class-name: true/false}的映射表。
表單
import { FormsModule } from '@angular/forms';
<input [(ngModel)]="userName">
提供雙向綁定,爲表單控件提供解析和驗證。
類裝飾器
import { Directive, ... } from '@angular/core';
@Component({...})
class MyComponent() {}聲明當前類是一個組件,並提供關於該組件的元數據。
@Directive({...})
class MyDirective() {}聲明當前類是一個指令,並提供關於該指令的元數據。
@Pipe({...})
class MyPipe() {}聲明當前類是一個管道,而且提供關於該管道的元數據。
@Injectable()
class MyService() {}聲明當前類有一些依賴,當依賴注入器建立該類的實例時,這些依賴應該被注入到構造函數中。
指令配置
@Directive({ property1: value1, ... })
selector: '.cool-button:not(a)'
指定一個CSS選擇器,以便在模板中找出該指令。支持的選擇器包括
element
,[attribute]
,.class
, 和:not()
。不支持父子關係選擇器。
providers: [MyService, { provide: ... }]
爲當前指令及其子指令提供依賴注入的providers數組。
組件配置
@Component
擴展了@Directive
, 以便@Directive
中的配置項也能用在組件上moduleId: module.id
若是設置了,
templateUrl
和styleUrl
會被解析成相對於組件的。viewProviders: [MyService, { provide: ... }]
依賴注入provider的數組,侷限於當前組件的視圖中。
template: 'Hello {{name}}'
templateUrl: 'my-component.html'當前組件視圖的內聯模板或外部模板地址
styles: ['.primary {color: red}']
styleUrls: ['my-component.css']內聯CSS樣式或外部樣式表URL的列表,用於給組件的視圖添加樣式。
供指令類或組件類用的字段裝飾器。
import { Input, ... } from '@angular/core';
@Input() myProperty;
聲明一個輸入屬性,以便咱們能夠經過屬性綁定更新它。(好比:
<my-cmp [my-property]="someExpression">
).@Output() myEvent = new EventEmitter();
聲明一個輸出屬性,以便咱們能夠經過事件綁定進行訂閱。(好比:
<my-cmp (my-event)="doSomething()">
).@HostBinding('[class.valid]') isValid;
把宿主元素的屬性(好比CSS類:valid)綁定到指令/組件的屬性(好比:isValid)。
@HostListener('click', ['$event']) onClick(e) {...}
經過指令/組件的方法(例如onClick)訂閱宿主元素的事件(例如click),可選傳入一個參數($event)。
@ContentChild(myPredicate) myChildComponent;
把組件內容查詢(myPredicate)的第一個結果綁定到類的myChildComponent屬性。
@ContentChildren(myPredicate) myChildComponents;
把組件內容查詢(myPredicate)的所有結果,綁定到類的myChildComponents屬性。
@ViewChild(myPredicate) myChildComponent;
把組件視圖查詢(myPredicate)的第一個結果綁定到類的myChildComponent屬性。對指令無效。
@ViewChildren(myPredicate) myChildComponents;
把組件視圖查詢(myPredicate)的所有結果綁定到類的myChildComponents屬性。對指令無效。
指令和組件的變動檢測與生命週期鉤子 (做爲類方法實現)
constructor(myService: MyService, ...) { ... }
類的構造函數會在全部其它生命週期鉤子以前調用。使用它來注入依賴,可是要避免用它作較重的工做。
ngOnChanges(changeRecord) { ... }
在輸入屬性每次變化了以後、開始處理內容或子視圖以前被調用。
ngOnInit() { ... }
在執行構造函數、初始化輸入屬性、第一次調用完ngOnChanges以後調用。
ngDoCheck() { ... }
每當檢查組件或指令的輸入屬性是否變化時調用。經過它,能夠用自定義的檢查方式來擴展變動檢測邏輯。
ngAfterContentInit() { ... }
當組件或指令的內容已經初始化、ngOnInit完成以後調用。
ngAfterContentChecked() { ... }
在每次檢查完組件或指令的內容以後調用。
ngAfterViewInit() { ... }
當組件的視圖已經初始化完畢,每次ngAfterContentInit以後被調用。只適用於組件。
ngAfterViewChecked() { ... }
每次檢查完組件的視圖以後調用。只適用於組件。
ngOnDestroy() { ... }
在所屬實例被銷燬前,只調用一次。
依賴注入配置 { provide: MyService, useClass: MyMockService }
把MyService類的提供商設置或改寫爲MyMockService。
{ provide: MyService, useFactory: myFactory }
把MyService的提供商設置或改寫爲myFactory工廠函數。
{ provide: MyValue, useValue: 41 }
把MyValue的提供商設置或改寫爲值41。
路由與導航
import { Routes, RouterModule, ... } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'path/:routeParam', component: MyComponent },
{ path: 'staticPath', component: ... },
{ path: '**', component: ... },
{ path: 'oldPath', redirectTo: '/staticPath' },
{ path: ..., component: ..., data: { message: 'Custom' } }
]);
const routing = RouterModule.forRoot(routes);爲應用配置路由。支持靜態、參數化、重定向和通配符路由。還支持自定義路由數據和解析。
<router-outlet></router-outlet>
<router-outlet name="aux"></router-outlet>標記一個位置,用於加載當前激活路由的組件。
<a routerLink="/path">
<a [routerLink]="[ '/path', routeParam ]">
<a [routerLink]="[ '/path', { matrixParam: 'value' } ]">
<a [routerLink]="[ '/path' ]" [queryParams]="{ page: 1 }">
<a [routerLink]="[ '/path' ]" fragment="anchor">基於路由指令建立指向不一樣視圖的連接,由路由路徑、必選參數、可選參數、查詢參數和片斷(fragment)組成。添加「/」前綴能夠導航到根路由。添加「./」前綴能夠導航到子路由。添加「../sibling」前綴能夠導航到兄弟路由或父路由。
<a [routerLink]="[ '/path' ]" routerLinkActive="active">
當
routerLink
被激活時,就把指定的CSS類添加到該元素上。class CanActivateGuard implements CanActivate {
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean { ... }
}
{ path: ..., canActivate: [CanActivateGuard] }一個用來定義類的接口,路由器會首先調用它來決定是否應該激活該組件。應該返回布爾值或能解析爲布爾值的可觀察對象(Observable)或承諾(Promise)。
class CanDeactivateGuard implements CanDeactivate<T> {
canDeactivate(
component: T,
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean { ... }
}
{ path: ..., canDeactivate: [CanDeactivateGuard] }一個用來定義類的接口,路由器在導航後會首先調用它來決定是否應該取消該組件的激活狀態。應該返回布爾值或能解析爲布爾值的可觀察對象(Observable)或承諾(Promise)。
class CanActivateChildGuard implements CanActivateChild {
canActivateChild(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean>|Promise<boolean>|boolean { ... }
}
{ path: ..., canActivateChild: [CanActivateGuard],
children: ... }一個用來定義類的接口,路由器會首先調用它來決定是否應該激活該子路由。應該返回布爾值或能解析爲布爾值的可觀察對象(Observable)或承諾(Promise)。
class ResolveGuard implements Resolve<T> {
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<any>|Promise<any>|any { ... }
}
{ path: ..., resolve: [ResolveGuard] }一個用來定義類的接口,路由器會在渲染該路由以前先調用它來解析路由數據。應該返回一個值或能解析爲值的可觀察對象(Observable)或承諾(Promise)。
class CanLoadGuard implements CanLoad {
canLoad(
route: Route
): Observable<boolean>|Promise<boolean>|boolean { ... }
}
{ path: ..., canLoad: [CanLoadGuard], loadChildren: ... }一個用來定義類的接口,路由器會首先調用它來決定一個惰性加載的模塊是否應該被加載。應該返回布爾值或能解析爲布爾值的可觀察對象(Observable)或承諾(
而後作了個練習:
若是照某些例子 import {Component,OnInit, NgFor, NgIf} from "@angular/core";//會報錯
(1,27): error TS2305: Module '"F:/work/vs1/node_modules/@angular/core/index"' has no exported member 'NgFor'.
...
[0] (1,34): error TS2305: Module '"F:/work/vs1/node_modules/@angular/core/index"' has no exported member 'NgIf'.
[0] Child html-webpack-plugin for "index.html":
export class AmwayComponent implements OnInit{ errorMessage:string; amwayData:any; constructor(private _globalService: GLobalService,private _uIHelperService:UIHelperService) {} ngOnInit() { let requestParams = new URLSearchParams(); requestParams.set('id', '22222'); this._globalService.ajaxCallerGet(this._globalService.getServiceURL('amway'), requestParams).subscribe( (data) => { this.amwayData=data; console.log("amway page data:::"+ data,this.amwayData); }, error => this.errorMessage = <any>error ); } }
NgFor 和 NgIf 如今在Component裏,不須要單獨提出來導入, OnInit是用來導入data的方法。
export const htmlTemplate = ` <div id = "amway"> <img class="logo" src="{{amwayData?.logo}}"> <div class="slogan"> <p *ngFor="let slogan of amwayData?.slogans">{{slogan}}</p> </div> <div class="nav"> <a *ngFor="let nav of amwayData?.navs"> {{nav.name}} </a> </div> <div class="inner_content"> <div class="left"> <ul> <li class="title">{{amwayData?.left.title}}</li> <li *ngFor="let list of amwayData?.left.lists"> <p class="name">{{list.name}}</p> <div class="subs" *ngIf="list.subs"> <p class="sub" *ngFor="let sub of list.subs"> {{sub}} </p> </div> </li> </ul> </div> <div class="right"> <p class="crumbs"> <span *ngFor="let crumb of amwayData?.right.crumbs">{{crumb}}</span> <p> <div class="inner_right"> <p class="table_top"> {{amwayData?.right.table_top}} <p> <p class="table_info"></p> </div> </div> </div> </div> `;
data是這樣的:
{ "logo": "assets/images/logo.png", "slogans": ["您好,","某某"], "top": ["個人賬戶", "快速選購", "購物籃", "中心", "登出", "English"], "navs": [{ "name": "紐崔萊" }, { "name": "雅姿" }, { "name": "個人護理" },
{ "name": "家居護理" }, { "name": "家居科技" }, { "name": "其餘產品" }, { "name": "優惠" },
{ "name": "產品配件" }, { "name": "XS" }], "left": { "title": "業績報告", "lists": [{ "name": "積分查詢", "subs": ["個人", "組內"] },
{ "name": "推薦先機獎金報告下載" }, { "name": "未送貨訂單資料壹組" }, { "name": "電子購貨單" },
{ "name": "組內還沒有使用指優惠券記錄" }, { "name": "個人業績記錄" }, { "name": "推薦記錄" },
{ "name": "個人獎勵記錄" }, { "name": "直銷商/優惠顧客狀況查詢" }, { "name": "個人及組員資料查詢" },
{ "name": "個人優惠券" }, { "name": "個人訂單" }, { "name": "業務拓展非/電子 優惠 - - 概覽" },
{ "name": "業務拓展非/電子 優惠 - - 直系小組縱覽" }] }, "right": { "crumbs": ["首頁 > ", "業務資訊 > ", "業績報告 > ", "積分查詢 > ", "組內"], "table_top":"組內", "search": ["搜尋直銷商", "優惠顧客編號", "搜尋"], "table": ["本月積分記錄", "獎金月份", "更新日期", "積分查詢", "直銷商/優惠顧客編號",
"直銷商/優惠顧客姓名", "戶籍類別", "組內積分額", "加入日期", "轉型日期"] } }