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. BZOJ 3625: [Codeforces Round #250]小朋友和二叉树

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 13 ...

  2. 【转】Git 安装和使用教程

    git 提交 全部文件 git add .  git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件.注意 -A 选项后面还有一个 ...

  3. Problem B: 专家系统 解题报告

    Problem B: 专家系统 Description 一个专家系统是指,你雇佣了\(n\)个专家,他们每个人会做出一个结果,然后你从中选取较多的专家的结果组合而成最终的结果.专家系统广泛应用于传统机 ...

  4. 修改docker镜像和容器的存放路径

    默认情况下,镜像和容器存放的路径是/var/lib/docker. 要修改这个设置很简单,把指定的目录软链到这个目录,或者将一个单独的分区挂载到这个目录,或者直接修改docker启动参数. 查看使用帮 ...

  5. django-pure-pagination 分页插件

    官网地址:https://github.com/jamespacileo/django-pure-pagination 官网上有详细的安装和使用介绍

  6. Java基础-类加载机制与自定义类Java类加载器(ClassLoader)

    Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...

  7. dedecms织梦首页判断,添加不同标题

    <title> {dede:field.title/} {dede:field name='typeid' runphp="yes"}(@me==0)? @me=&qu ...

  8. JS 简易控制台插件 [供 博客, 论坛 运行js用]

    今天厚着脸皮来推荐下鄙人写的一个小插件吧.看过我博客的应该都熟悉这个插件了,其实就是这货. 这东西是我去年写的,当时水平也不怎么样,不过好歹还是实现了简单功能.我先简单介绍下这东西什么用吧. 因为在 ...

  9. 封装JSON数据转自定义HTML方法parseHTML

    开发过程中经常使用字符串拼接,这样做工作效率低,可维护性和易读性也比较差,且对于后台程序员对html不熟悉,经常出错. 如下面例子json转字符串: var json = [{ href:'http: ...

  10. Spring Mvc 一个接口多个继承; (八)

    在 spring 注解实现里,一个接口一般是不能多继承的! 除非在 bean 配置文件里有 针对这个 实现类的配置: <beans:bean id="icService" c ...