089E8213-B446-44A5-A322-CA82DEDDB609.png

第三方

ngx

material

cdk

compdoc

  1. {
  2. "scripts": {
  3. "compodoc": "compodoc -p tsconfig.json -d ./compodoc -s -o"
  4. }
  5. }

#ng-zorro

【nz-modal】服务方式创建可destroy

在组件中可直接销毁destroy

【placeholder】

  1. <nz-cascader
  2. nzPlaceHolder='类目'
  3. [(ngModel)]="selectedCategory">
  4. </nz-cascader>
  1. export class SearchWayComponent implements OnInit {
  2. selectedCategory: string; // 这里不要赋值为'',否则placeholder不显示
  3. }

Http

【http错误处理】拦截器

【加载层】rxjs的方法

异步

【async安全管道操作符】

  1. <div class="shipping-item" *ngFor="let shipping of shippingCosts | async">

表单

案例

  • 字段分类 —— 响应式表单
  • 表单提交模式 —— 模板驱动表单
  • 添加颜色 —— 策略模式

    变化的表单(非正式的动态表单)

    每次必须重新渲染
    image.png

    【formBuilder】

    1. <form [formGroup]="checkoutForm" (ngSubmit)="onSubmit(checkoutForm.value)">
    2. <input formControlName="name">
    3. <input formControlName="address">
    4. <button type="submit">Purchase</button>
    5. </form>
  1. import { FormBuilder } from '@angular/forms';
  2. export class CartComponent implements OnInit {
  3. checkoutForm;
  4. constructor(
  5. private formBuilder: FormBuilder
  6. ) {
  7. this.checkoutForm = this.formBuilder.group({
  8. name: '',
  9. address: ''
  10. });
  11. }
  12. this.checkoutForm.reset();
  13. }

组件

【emit】

可在html中直接emit

  1. <button (click)="notify.emit()">notify me!</button>

【onchanges】
注意它是任意有一个属性改变即触发

【计算属性?】

does angular have the “computed property” feature like in vue.js?
计算属性是基于它们的响应式依赖进行缓存的、
方法相比计算属性之下,每当触发重新渲染时,调用方法将总会再次执行函数。
我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

其它

【location】

  1. import { Location } from '@angular/common';
  2. this.location.back();

路由

【paramMap】

  1. const HERO_ID = this.route.snapshot.paramMap.get('id')
  1. // 订阅(subscribe)路由参数并根据其 productId 获取商品信息
  2. this.route.paramMap.subscribe(params => {
  3. this.product = products[+params.get('productId')];
  4. });

Service

【service中间层】

可存数据:messages

  1. export class MessageService {
  2. messages: string[] = [];
  3. constructor() { }
  4. add(message: string): void {
  5. this.messages.push(message);
  6. }
  7. }

【公共服务】

  1. <div *ngIf="messageService.messages.length">
  2. <button class="clear"
  3. (click)="messageService.clear()">clear</button>
  4. <div *ngFor='let message of messageService.messages'> {{message}} </div>
  5. </div>
  1. export class MessagesComponent implements OnInit {
  2. // 这个 messageService 属性必须是公共属性,因为你将会在模板中绑定到它。
  3. // Angular 只会绑定到组件的公共属性。
  4. constructor(public messageService: MessageService) { }
  5. }

TypeScript

【类型声明】

可用interface和class

  1. class Book {
  2. id: number;
  3. name: string;
  4. author: string;
  5. summary: string;
  6. constructor(id?: number) {
  7. if (typeof id === 'number') {
  8. this.id = id;
  9. this.name = 'book' + id;
  10. this.author = 'author' + id;
  11. this.summary = 'summary' + id;
  12. }
  13. }
  14. }
  15. export {
  16. Book
  17. }

【泛型as】

  1. this.heroService.addHero({name} as Hero).subscribe(hero => {});

RXJS

【订阅】

  1. searchHeroes(term: string): Observable<Hero[]> {
  2. return this.http.get<Hero[]>(URL).pipe(
  3. tap(_ => this.log(`found heroes matching ${term}`)),
  4. catchError(this.handleError<Hero[]>('search heroes', []))
  5. );
  6. }

【防抖】详见英雄案例

  1. <li *ngFor="let hero of heroes$ | async"></li>
  1. import { Observable, Subject } from 'rxjs';
  2. export class HeroSearchComponent implements OnInit {
  3. heroes$: Observable<Hero[]>;
  4. private searchTerms = new Subject<string>();
  5. // Push a search term into the observable stream.
  6. this.searchTerms.next(term);
  7. ngOnInit() {
  8. this.heroes$ = this.searchTerms.pipe(
  9. // ...
  10. );
  11. }
  12. }

Zone

  1. this.zone.run(() => this.materials = this.materials); // 图档group-search

perfect-scroll-bar

  • 下拉触底
  • 手动/自动滚动

    scroll滚动

  • 下拉懒加载

  • rxjs方式