1. 创建组件 ng generate component heroes

  2. {{ hero.name }} {{}}语法绑定数据

  3. 管道pipe 格式化数据

    <h2>{{ hero.name | uppercase }} Details</h2>
  4. [(ngModel)] 双向绑定,form需要引入FormsModule

  5. AppModule 放置元数据(metadata)

    a. @NgModule 装饰器 imports导入外部模块

    b. declarations 放置组件

     @NgModule({
    declarations: [
    AppComponent,
    HeroesComponent
    ],
    imports: [
    BrowserModule,
    FormsModule
    ],
    providers: [],
    bootstrap: [AppComponent]
    })
  6. *ngFor Angular 的复写器(repeater)指令,使用let xx of xxs遍历

  7. 绑定click使用 (click)

     <li *ngFor="let hero of heroes" (click)="onSelect(hero)">
  8. *ngIf 条件判断

     <div *ngIf="selectedHero">
  9. 条件css类

     [class.selected]="hero === selectedHero"
  10. 组件的输入参数,需要使用 @Input() 装饰器

    @Component({
    selector: 'app-hero-detail',
    templateUrl: './hero-detail.component.html',
    styleUrls: ['./hero-detail.component.css']
    })

    a. @Input() hero: Hero

    b. <app-hero-detail [hero]="selectedHero">

  11. 服务

    a. 组件不应该直接获取或保存数据,它们不应该了解是否在展示假数据。 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务

    b. 服务负责业务数据获取和保存,让组件只需要关注展示

    c. 通过注入,服务可以在多个“互相不知道”的类之间共享信息

    d. 创建服务 ng generate service hero

    import { Injectable } from '@angular/core';
    
    @Injectable({
    providedIn: 'root',
    })
    export class HeroService {
    constructor() { }
    }

    e. Injectable 可依赖注入装饰器

  12. 依赖注入的接入(提供 provide)

    a. 使用service之前,需要将服务提供给依赖注入系统,提供注册一个provider来实现

    b. Angular CLI 命令 ng generate service 会通过给 @Injectable 装饰器添加元数据的形式 providedIn: 'root', 当你在顶层提供该服务时,Angular 就会为 HeroService 创建一个单一的、共享的实例,并把它注入到任何想要它的类上

    c. 如何注入 Service,在component添加私有构造函数

    constructor(private heroService: HeroService) { }

    1. 声明了一个私有 heroService 属性,

    2. 把它标记为一个 HeroService 的注入点

  13. 在ngOnInit 中调用service获取数据

    a. 虽然构造函数也可以调用,但是我们需要让构造函数保持简单,只做初始化操作

    b. 使用ngOnInit 生命周期钩子中调用服务

  14. RXJS 处理异步操作

    a. 异步处理可以使用回调函数,可以返回 Promise(承诺),也可以返回 Observable(可观察对象)

    b. angular使用了Rxjs,因此使用Observable,Observable 是 RxJS 库中的一个关键类

    c. 引入import { Observable, of } from 'rxjs'

    getHeroes(): Observable<Hero[]> {
    return of(HEROES);
    }

of(HEROES) 会返回一个 Observable<Hero[]>,它会发出单个值,这个值就是这些模拟英雄的数组。

d. 订阅Observable

	 this.heroService.getHeroes()
.subscribe(heroes => this.heroes = heroes);
  1. 组件可绑定public的service的属性

    export class MessageService {
    messages: string[] = [];
    }
    constructor(public messageService: MessageService) {}
    <div *ngFor='let message of messageService.messages'> {{message}} </div>
  2. 路由

    a. Angular 的最佳实践之一就是在一个独立的顶级模块中加载和配置路由器,它专注于路由功能,然后由根模块 AppModule 导入它

    b. ng generate module app-routing --flat --module=app

    c. 添加路由 ,路由定义 会告诉路由器,当用户点击某个链接或者在浏览器地址栏中输入某个 URL 时,要显示哪个视图,因此路由包含两个属性:

    i. path:一个用于匹配浏览器地址栏中 URL 的字符串

    ii. component:当导航到此路由时,路由器应该创建哪个组件

    	const routes: Routes = [
    { path: 'heroes', component: HeroesComponent }
    ];
  3. 初始化路由

    a. 要使用路由,必须首先初始化路由器,并让它开始监听浏览器中的地址变化

    b. 把 RouterModule 添加到 @NgModule.imports 数组中,并用 routes 来配置它

    c. imports: [ RouterModule.forRoot(routes) ],

  4. 路由出口(RouterOutlet)

    	<h1>{{title}}</h1>
    <router-outlet></router-outlet>
    <app-messages></app-messages>
  5. 路由链接 (routerLink),在a里添加routerLink

    <a routerLink="/heroes">Heroes</a>
  6. 默认路由

    a. { path: '', redirectTo: '/dashboard', pathMatch: 'full' }

  7. 参数化路由

    a. { path: 'detail/:id', component: HeroDetailComponent }

    b. 在component中,构造函数增加ActivatedRoute 、location

    i. ActivatedRoute 保存着到lComponent 实例的路由信息,this.route.snapshot.paramMap.get('id')

    ii. location 是一个 Angular 的服务,用来与浏览器打交道,this.location.back() 返回上一页

  8. HTTP

    a. HttpClient 是 Angular 通过 HTTP 与远程服务器通讯的机制

    b. 使用http,需要在AppModule中, @angular/common/http 中导入 HttpClientModule 符号,并把它加入 @NgModule.imports 数组

    c. 使用

    	getHeroes (): Observable<Hero[]> {
    return this.http.get<Hero[]>(this.heroesUrl)
    } d. 错误处理 使用 .pipe() 方法来扩展 Observable 的结果,并给它一个 catchError() 操作符 import { catchError, map, tap } from 'rxjs/operators';
    getHeroes (): Observable<Hero[]> {
    return this.http.get<Hero[]>(this.heroesUrl)
    .pipe(
    catchError(this.handleError('getHeroes', []))
    );
    }

catchError() 操作符会拦截失败的 Observable。 它把错误对象传给错误处理器,错误处理器会处理这个错误

		private handleError<T> (operation = 'operation', result?: T) {
return (error: any): Observable<T> => { // TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead // TODO: better job of transforming error for user consumption
this.log(`${operation} failed: ${error.message}`); // Let the app keep running by returning an empty result.
return of(result as T);
};
}

在控制台中汇报了这个错误之后,这个处理器会汇报一个用户友好的消息,并给应用返回一个安全值,让它继续工作,可以使用tap窥探(tap)Observable

		getHeroes (): Observable<Hero[]> {
return this.http.get<Hero[]>(this.heroesUrl)
.pipe(
tap(heroes => this.log(`fetched heroes`)),
catchError(this.handleError('getHeroes', []))
);
}
  1. 模板绑定Observable

  2. $ 是一个命名惯例,用来表明 heroes$ 是一个 Observable,而不是数组。
    *ngFor 不能直接使用 Observable。 不过,它后面还有一个管道字符(|),后面紧跟着一个 async,它表示 Angular 的 AsyncPipe。

    private searchTerms = new Subject<string>();
    
    // Push a search term into the observable stream.
    search(term: string): void {
    this.searchTerms.next(term);
    } this.heroes$ = this.searchTerms.pipe(
    // wait 300ms after each keystroke before considering the term
    debounceTime(300), // ignore new term if same as previous term
    distinctUntilChanged(), // switch to new search observable each time the term changes
    switchMap((term: string) => this.heroService.searchHeroes(term)),
    );

延伸阅读:


作者:Jadepeng

出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi

您的支持是对博主最大的鼓励,感谢您的认真阅读。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Angular 快速学习笔记(1) -- 官方示例要点的更多相关文章

  1. Angular快速学习笔记(2) -- 架构

    0. angular 与angular js angular 1.0 google改名为Angular js 新版本的,2.0以上的,继续叫angular,但是除了名字还叫angular,已经是一个全 ...

  2. Angular快速学习笔记(4) -- Observable与RxJS

    介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息. 可观察对象可以发送多个任意类型的值 -- 字面量.消息.事件. 基 ...

  3. Angular快速学习笔记(3) -- 组件与模板

    1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性. 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表 ...

  4. Knockout.js快速学习笔记

    原创纯手写快速学习笔记(对官方文档的二手理解),更推荐有时间的话读官方文档 框架简介(Knockout版本:3.4.1 ) Knockout(以下简称KO)是一个MVVM(Model-View-Vie ...

  5. Angular【学习笔记】

    1.angular入门网站 感谢@菜鸟教程:http://www.runoob.com/angularjs/angularjs-tutorial.html 学习笔记:

  6. C#快速学习笔记(译)

    下面是通过代码快速学习C#的例子. 1.学习任何语言都必定会学到的hello,world! using System; public class HelloWorld { public static ...

  7. 【Microsoft Azure学习之旅】消息服务Service Bus的学习笔记及Demo示例

    今年项目组做的是Cloud产品,有幸接触到了云计算的知识,也了解并使用了当今流行的云计算平台Amazon AWS与Microsoft Azure.我们的产品最初只部署在AWS平台上,现在产品决定同时支 ...

  8. Java快速学习笔记01

    这一波快速学习主要是应付校招笔面试用,功利性质不可避免. 学习网址: http://www.runoob.com/java/java-tutorial.html 执行命令解析: 以上我们使用了两个命令 ...

  9. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...

随机推荐

  1. 【刷题】洛谷 P4782 【模板】2-SAT 问题

    题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 \(x_1\)​~\(x_n\)​,另有m个需要满足的条件,每个条件的形式都是"\(x_i\)​为true/false或\(x_j ...

  2. 【Revit API】创建相机视角

    在Revit中有一个相机功能可以以相机视角产生一个视图.一开始我在Revit2016的API文档中找关键词Camera,但是没什么收获. 其实这个相机功能的真正核心是创建透视视图:View3D.Cre ...

  3. 循环取月的三位英语名 Jan Feb

    CultureInfo ci = new CultureInfo("en-US"); DateTime now = DateTime.Now; for (int i = 0; i ...

  4. 【洛谷P1823】音乐会的等待 单调栈+二分

    题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...

  5. springboot配置文件的配置

    转:https://www.cnblogs.com/zheting/p/6707036.html Spring Boot使用了一个全局的配置文件application.properties,放在src ...

  6. 阿里云ECS使用cloudfs4oss挂载OSS

    cloudfs4oss可以帮我们将OSS直接挂载到ECS上,就像一个目录一样方便访问.使用方法: 1.安装配置环境: yum install libcurl libcurl-devel openssl ...

  7. ftp服务部署

    注:Centos7环境,添加用户指定目录后默认其为此用户的共享目录. chroot_local_user=YES chroot_list_enable=YES # (default follows) ...

  8. 第一次使用 markdown 写博客

    Web前端 js 框架(四选一) 有可能的话,学 Vue.js ,React.js ,Angular.js,Awrelia css 学习 Sass 学会 css 的可编程 HTML5 详细语法 Nod ...

  9. Java SSM框架之MyBatis3(六)MyBatis之参数传递

    一.单个参数  StudentParamsMapper package cn.cnki.ref.mapper; import cn.cnki.ref.pojo.Student; public inte ...

  10. python 基础 元组()

    # 元组 应用场景 # 尽管 Python的列表中可以存储不同类型的数据 # 但是在开发中,更多的应用场景是 # 1.列表存储相同类型的数据 # 2.通过迭代遍历,在循环体内部,针对列表中的每一项元素 ...