npm install -g @angular/cli
ng serve --open
ng serve
命令会构建本应用、启动开发服务器、监听源文件,并且当那些文件发生变化时重新构建本应用。
--open
标志会打开浏览器
ng generate component heroes --module=app
ng generate service hero --module=app
--module=app
参数来告诉 CLI 要自动在模块级提供该服务。
你还可以使用 CLI 命令 ng update
发现 Angular 的最新版本。默认情况下,ng update
(不需要其它参数)会列出你可用的所有更新。
<h2>{{hero.name | uppercase}} Details</h2>
绑定表达式中的 uppercase
位于管道操作符( | )的右边,用来调用内置管道 UppercasePipe
。
<input [(ngModel)]="hero.name" placeholder="name">
[(ngModel)] 是 Angular 的双向数据绑定语法。
<li *ngFor="let hero of heroes">
*ngFor
是一个 Angular 的复写器(repeater)指令。 它会为列表中的每项数据复写它的宿主元素。
<li *ngFor="let hero of heroes" [class.selected]="hero === selectedHero" (click)="onSelect(hero)"> <span class="badge">{{hero.id}}</span> {{hero.name}} </li>
如果当前行的英雄和 selectedHero
相同,Angular 就会添加 CSS 类 selected
,否则就会移除它。
<app-hero-detail [hero]="selectedHero"></app-hero-detail>
[hero]="selectedHero"
是 Angular 的属性绑定语法。
这是一种单向数据绑定。从 HeroesComponent
的 selectedHero
属性绑定到目标元素的 hero
属性,并映射到了 HeroDetailComponent
的 hero
属性。
在 ngOnInit
中调用它
让构造函数保持简单,只做初始化操作,比如把构造函数的参数赋值给属性。 构造函数不应该做任何事。 它肯定不能调用某个函数来向远端服务(比如真实的数据服务)发起 HTTP 请求。
<li *ngFor="let hero of heroes$ | async" >
*ngFor
不能直接使用 Observable
。 不过,它后面还有一个管道字符(|
),后面紧跟着一个 async
,它表示 Angular 的 AsyncPipe
。
AsyncPipe
会自动订阅到 Observable
,这样你就不用再在组件类中订阅了。
<input #searchBox id="search-box" (keyup)="search(searchBox.value)" />
每当用户在文本框中输入时,这个事件绑定就会使用文本框的值(搜索词)调用 search()
函数。 searchTerms
变成了一个能发出搜索词的稳定的流。
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)),
);
-
在传出最终字符串之前,
debounceTime(300)
将会等待,直到新增字符串的事件暂停了 300 毫秒。 你实际发起请求的间隔永远不会小于 300ms。 -
distinctUntilChanged()
会确保只在过滤条件变化时才发送请求。 -
switchMap()
会为每个从debounce
和distinctUntilChanged
中通过的搜索词调用搜索服务。 它会取消并丢弃以前的搜索可观察对象,只保留最近的。 -
借助 switchMap 操作符, 每个有效的击键事件都会触发一次
HttpClient.get()
方法调用。 即使在每个请求之间都有至少 300ms 的间隔,仍然可能会同时存在多个尚未返回的 HTTP 请求。switchMap()
会记住原始的请求顺序,只会返回最近一次 HTTP 方法调用的结果。 以前的那些请求都会被取消和舍弃。注意,取消前一个
searchHeroes()
可观察对象并不会中止尚未完成的 HTTP 请求。 那些不想要的结果只会在它们抵达应用代码之前被舍弃。