Angular

cli:

npm install -g @angular/cli

组件

// product-list.component.ts
import { Component } from '@angular/core';
import { products } from '../products';

@Component({
  selector: 'app-product-list', // 标识组件
  // 模板及样式文件路径
  templateUrl: './product-list.component.html',
  styleUrls: ['./product-list.component.css']
})
export class ProductListComponent {
  // 可被在模板中使用的变量
  products = products;

  // 可被在模板中被调用的方法
  share() {
    window.alert('The product has been shared!');
  }
  show(name: string) {
    window.alert('this is ' + name)
  }
  desory(name: string) {
    window.alert('destory ' + name)
  }
}
<!-- product-list.component.html -->
<h2>Products</h2>

<!-- 列表渲染 -->
<div *ngFor="let product of products">
  <h4>
    <!-- title属性渲染 click事件绑定 -->
    <a [title]="product.price" (click)="show(product.name)">{{
      product.name
    }}</a>
    <!-- 条件渲染 -->
    <p *ngIf="product.description">{{ product.description }}</p>
    <!-- 使用子组件 数据传递及事件触发 -->
    <app-product-alerts [product]="product" (notify)="desory(product.name)"></app-product-alerts>
  </h4>
</div>

路由

// app.module.ts
@NgModule({
  imports: [
    RouterModule.forRoot([
      { path: 'product/:productId', component: ProductDetailComponent },
    ])
  ],
  ....
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-product-detail',
  templateUrl: './product-detail.component.html',
  styleUrls: ['./product-detail.component.css']
})
export class ProductDetailComponent implements OnInit {

  product: string | undefined

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    const routeParams = this.route.snapshot.paramMap;
    this.product = routeParams.get('productId')!;
  }

}

管理数据

// cart.service.ts
import { Injectable } from '@angular/core';

@Injectable(
  {providedIn: 'root'}
)
export class CartService {

  items: string[] = []

  constructor() { }

  add(item: string) {
    this.items.push(item);
    console.log(this.items)
  }

  getItems(): string[] {
    return this.items
  }

}
constructor(
    private route: ActivatedRoute,
    private cartService: CartService
) { }
addToCart(){
  this.cartService.add(this.product!)
}

表单输入

// app.module.ts
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
  imports:      [ BrowserModule, ReactiveFormsModule ],
  declarations: [ AppComponent],
  bootstrap:    [ AppComponent ]
})
export class AppComponent  {
 loginForm: FormGroup;

  constructor(
    private fb: FormBuilder
  ) { }

  ngOnInit(): void {
    this.loginForm = this.fb.group({
      username: ['', Validators.required],
      password: ['', Validators.required],
    });
  }
  ...
<form [formGroup]="loginForm" (ngSubmit)="onSubmit()">
      <div class="form-group">
          <input type="email" class="form-control" formControlName="username" required placeholder="username: name@example.com">
      </div>
      <div class="form-group">
          <input type="password" class="form-control" formControlName="password" required placeholder="password: admin123">
      </div>
      <button type="submit" [disabled]="!loginForm.valid" class="btn btn-primary btn-block">Login</button>
</form>