Angular 4 快速入门
目录
第一节 Angular 简介Angular 是什么Angular 是由谷歌开发与维护一个开发跨平台应用程序的框架,同时适用于手机与桌面。 Angular 有什么特点
Angular 提供了哪些功能
Angular 与 AngularJS 有什么区别
第二节 - Angular 环境搭建基础要求
Angular 开发环境配置方式
配置开发环境本快速入门教程,选用第一种配置方式搭建 Angular 开发环境: 基于 Angular Quickstart
git clone https://github.com/angular/quickstart ng4-quickstart
code ./ng4-quickstart
npm i
npm start 基于 Angular CLI
npm install -g @angular/cli
ng --version
ng new PROJECT-NAME
cd PROJECT-NAME ng serve 第三节 - 插值表达式在 Angular 中,我们可以使用 绑定普通文本import { Component } from '@angular/core'; @Component({ selector: 'my-app',template: `<h1>Hello {{name}}</h1>`,}) export class AppComponent { name = 'Angular'; } 绑定对象属性import { Component } from '@angular/core'; @Component({ selector: 'my-app',template: ` <h2>大家好,我是{{name}}</h2> <p>我来自<strong>{{address.province}}</strong>省,<strong>{{address.city}}</strong>市 </p> `,}) export class AppComponent { name = 'Semlinker'; address = { province: '福建',city: '厦门' } } 值得一提的是,我们可以使用 Angular 内置的 @Component({ selector: 'my-app',template: ` ... <p>{{address | json}}</p> `,city: '厦门' } } 第四节 - 自定义组件在 Angular 中,我们可以通过 基础知识定义组件的元信息在 Angular 中,我们可以使用 @Component({ selector: 'my-app',// 用于定义组件在HTML代码中匹配的标签 template: `<h1>Hello {{name}}</h1>`,// 定义组件内嵌视图 }) 定义组件类export class AppComponent { name = 'Angular'; } 定义数据接口在 TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。 interface Person { name: string; age: number; } let semlinker: Person = { name: 'semlinker',age: 31 }; 自定义组件示例创建 UserComponent 组件import { Component } from '@angular/core'; @Component({ selector: 'sl-user',<strong>{{address.city}}</strong>市 </p> ` }) export class UserComponent { name = 'Semlinker'; address = { province: '福建',city: '厦门' }; } 声明 UserComponent 组件// ... import { UserComponent } from './user.component'; @NgModule({ imports: [ BrowserModule ],declarations: [ AppComponent,UserComponent],bootstrap: [ AppComponent ] }) export class AppModule { } 使用 UserComponent 组件import { Component } from '@angular/core'; @Component({ selector: 'my-app',template: ` <sl-user></sl-user> `,}) export class AppComponent {} 使用构造函数初始化数据@Component({...}) export class UserComponent { name: string; address: any; constructor() { this.name = 'Semlinker'; this.address = { province: '福建',city: '厦门' } } } 接口使用示例定义 Address 接口interface Address { province: string; city: string; } 使用 Address 接口export class UserComponent { name: string; address: Address; // ... } 第五节 - 常用指令简介在 Angular 实际项目中,最常用的指令是 基础知识ngIf 指令简介该指令用于根据表达式的值,动态控制模板内容的显示与隐藏。它与 AngularJS 1.x 中的 ngIf 指令语法<div *ngIf="condition">...</div> ngFor 指令简介该指令用于基于可迭代对象中的每一项创建相应的模板。它与 AngularJS 1.x 中的 ngFor 指令语法<li *ngFor="let item of items;">...</li> ngIf 与 ngFor 指令使用示例import { Component } from '@angular/core'; interface Address { province: string; city: string; } @Component({ selector: 'sl-user',<strong>{{address.city}}</strong>市 </p> <div *ngIf="showSkills"> <h3>我的技能</h3> <ul> <li *ngFor="let skill of skills"> {{skill}} </li> </ul> </div> ` }) export class UserComponent { name: string; address: Address; showSkills: boolean; skills: string[]; constructor() { this.name = 'Semlinker'; this.address = { province: '福建',city: '厦门' }; this.showSkills = true; this.skills = ['AngularJS 1.x','Angular 2.x','Angular 4.x']; } } 第六节 - 事件绑定在 Angular 中,我们可以通过 基础知识事件绑定语法<date-picker (dateChanged)="statement()"></date-picker> 等价于 <date-picker on-dateChanged="statement()"></date-picker> 介绍完事件绑定的语法,接下来我们来为第五节中的 事件绑定示例@Component({ selector: 'sl-user',template: ` ... <button (click)="toggleSkills()"> {{ showSkills ? "隐藏技能" : "显示技能" }} </button> ... ` }) export class UserComponent { // ... toggleSkills() { this.showSkills = !this.showSkills; } } 第七节 - 表单模块简介Angular 中有两种表单:
本小节主要介绍模板驱动式的表单,接下来我们来演示如何通过表单来为我们的之前创建的 基础知识导入表单模块import { FormsModule } from '@angular/forms'; // ... @NgModule({ imports: [BrowserModule,FormsModule],declarations: [AppComponent,bootstrap: [AppComponent] }) export class AppModule { } 模板变量语法<video #player></video> <button (click)="player.pause()">Pause</button> 等价于 <video ref-player></video> 表单使用示例@Component({ selector: 'sl-user',template: ` ... <div *ngIf="showSkills"> <h3>我的技能</h3> ... <form (submit)="addSkill(skill.value)"> <label>添加技能</label> <input type="text" #skill> </form> </div> ` }) export class UserComponent { // ... addSkill(skill: string) { let skillStr = skill.trim(); if (this.skills.indexOf(skillStr) === -1) { this.skills.push(skillStr); } } } 第八节 - Http 模块简介基础知识导入 Http 模块// ... import { HttpModule } from '@angular/http'; @NgModule({ imports: [BrowserModule,FormsModule,HttpModule],bootstrap: [AppComponent] }) export class AppModule { } 使用 Http 服务步骤(1) 从 (2) 导入 RxJS 中的 (3) 使用 DI 方式注入 http 服务 (4) 调用 http 服务的 (5) 调用 Response 对象的 (6) 把请求的结果,赋值给对应的属性 Http 服务使用示例使用 Http 服务import { Component,OnInit } from '@angular/core'; import { Http } from '@angular/http'; // (1) import 'rxjs/add/operator/map'; // (2) interface Member { id: string; login: string; avatar_url: string; } @Component({ selector: 'sl-members',template: ` <h3>Angular Orgs Members</h3> <ul *ngIf="members"> <li *ngFor="let member of members;"> <p> <img [src]="member.avatar_url" width="48" height="48"/> ID:<span>{{member.id}}</span> Name: <span>{{member.login}}</span> </p> </li> </ul> ` }) export class MembersComponent implements OnInit { members: Member[]; constructor(private http: Http) { } // (3) ngOnInit() { this.http.get(`https://api.github.com/orgs/angular/members?page=1&per_page=5`) // (4) .map(res => res.json()) // (5) .subscribe(data => { if (data) this.members = data; // (6) }); } } 声明 MembersComponent 组件// ... import { MembersComponent } from './members.component'; @NgModule({ imports: [BrowserModule,UserComponent,MembersComponent],bootstrap: [AppComponent] }) export class AppModule { } 使用 MembersComponent 组件import { Component } from '@angular/core'; @Component({ selector: 'my-app',template: ` <sl-members></sl-members> `,}) export class AppComponent {} 第九节 - 注入服务基础知识组件中注入服务步骤(1) 配置已创建的服务,如: @NgModule({ // ... providers: [MemberService] }) export class AppModule { } (2) 导入已创建的服务,如: import { MemberService } from '../member.service'; (3) 使用构造注入方式,注入服务: export class MembersComponent implements OnInit { // ... constructor(private memberService: MemberService) { } } 服务使用示例创建 MemberService 服务import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; @Injectable() export class MemberService { constructor(private http: Http) { } getMembers() { return this.http .get(`https://api.github.com/orgs/angular/members?page=1&per_page=5`) .map(res => res.json()) } } 配置 MemberService 服务import { MemberService } from "./member.service"; @NgModule({ // ... providers:[MemberService],bootstrap: [AppComponent] }) export class AppModule { } 使用 MemberService 服务// ... import { MemberService } from "./member.service"; @Component({...}) export class MembersComponent implements OnInit { members: Member[]; constructor(private memberService: MemberService) { } ngOnInit() { this.memberService.getMembers() .subscribe(data => { if (data) this.members = data; }); } } 第十节 - 路由模块简介基础知识导入路由模块// ... import { RouterModule } from '@angular/router'; @NgModule({ imports: [BrowserModule,HttpModule,RouterModule],bootstrap: [AppComponent] }) export class AppModule { } 配置路由信息import { Routes,RouterModule } from '@angular/router'; import { UserComponent } from './user.component'; export const ROUTES: Routes = [ { path: 'user',component: UserComponent } ]; @NgModule({ imports: [ BrowserModule,RouterModule.forRoot(ROUTES) ],// ... }) export class AppModule {} routerLink 指令为了让我们链接到已设置的路由,我们需要使用 routerLink 指令,具体示例如下: <nav> <a routerLink="/">首页</a> <a routerLink="/user">我的</a> </nav> 当我们点击以上的任意链接时,页面不会被重新加载。反之,我们的路径将在 URL 地址栏中显示,随后进行后续视图更新,以匹配 router-outlet 指令该指令用于告诉 Angular 在哪里加载组件,当 Angular 路由匹配到响应路径,并成功找到需要加载的组件时,它将动态创建对应的组件,并将其作为兄弟元素,插入到 @Component({ selector: 'app-root',template: ` <div class="app"> <h3>Our app</h3> <router-outlet></router-outlet> </div> ` }) export class AppComponent {} 路由使用示例配置路由信息export const ROUTES: Routes = [ { path: '',pathMatch: 'full',redirectTo: 'user' },{ path: 'user',component: UserComponent },{ path: 'members',component: MembersComponent } ]; @NgModule({ imports: [BrowserModule,RouterModule.forRoot(ROUTES)],// ... }) export class AppModule { } 配置路由导航import { Component } from '@angular/core'; @Component({ selector: 'my-app',template: ` <div class="app"> <h1>欢迎来到Angular的世界</h1> <nav> <a routerLink="/user">我的</a> <a routerLink="/members">Angular成员</a> </nav> <router-outlet></router-outlet> </div> `,}) export class AppComponent { } 完整示例AppModuleimport { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { RouterModule,Routes } from '@angular/router'; import { AppComponent } from './app.component'; import { UserComponent } from './user.component'; import { MembersComponent } from './members.component'; import { MemberService } from "./member.service"; export const ROUTES: Routes = [ { path: '',providers: [MemberService],bootstrap: [AppComponent] }) export class AppModule { } AppComponentimport { Component } from '@angular/core'; @Component({ selector: 'my-app',}) export class AppComponent { } UserComponentimport { Component } from '@angular/core'; interface Address { province: string; city: string; } @Component({ selector: 'sl-user',<strong>{{address.city}}</strong>市 </p> <button (click)="toggleSkills()"> {{ showSkills ? "隐藏技能" : "显示技能" }} </button> <div *ngIf="showSkills"> <h3>我的技能</h3> <ul> <li *ngFor="let skill of skills"> {{skill}} </li> </ul> <form (submit)="addSkill(skill.value)"> <label>添加技能</label> <input type="text" #skill> </form> </div> ` }) export class UserComponent { name: string; address: Address; showSkills: boolean; skills: string[]; constructor() { this.name = 'Semlinker'; this.address = { province: '福建','Angular 4.x']; } toggleSkills() { this.showSkills = !this.showSkills; } addSkill(skill: string) { let skillStr = skill.trim(); if (this.skills.indexOf(skillStr) === -1) { this.skills.push(skillStr); } } } MembersComponentimport { Component,OnInit } from '@angular/core'; import { Http } from '@angular/http'; import 'rxjs/add/operator/map'; import { MemberService } from "./member.service"; interface Member { id: string; login: string; avatar_url: string; } @Component({ selector: 'sl-members',template: ` <h3>Angular Orgs Members</h3> <ul *ngIf="members"> <li *ngFor="let member of members;"> <p> <img [src]="member.avatar_url" width="48" height="48"/> ID:<span>{{member.id}}</span> Name: <span>{{member.login}}</span> </p> </li> </ul> ` }) export class MembersComponent implements OnInit { members: Member[]; constructor(private memberService: MemberService) { } ngOnInit() { this.memberService.getMembers() .subscribe(data => { if (data) this.members = data; }); } } MemberServiceimport { Injectable } from '@angular/core'; import { Http } from '@angular/http'; @Injectable() export class MemberService { constructor(private http: Http) { } getMembers() { return this.http .get(`https://api.github.com/orgs/angular/members?page=1&per_page=5`) .map(res => res.json()) } } 我有话说除了本系列教程外,还有其它学习资源么?本系列教程的主要目的是让初学者对 Angular 的相关基础知识,有一定的了解。除了本系列教程外,初学者还可以参考以下教程:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |