1. 创建新的工作区和一个初始应用

ng new angular-tour-of-heroes

/*

要想创建一个新的工作区和一个初始应用项目,需要:

1. 确保你现在没有位于 Angular 工作区的文件夹中。例如,如果你之前已经创建过 "快速上手" 工作区,请回到其父目录中。

2. 运行 CLI 命令 ng new,空间名请使用 angular-tour-of-heroes

3. ng new 命令会提示你输入要在初始应用项目中包含哪些特性,请按 Enter 或 Return 键接受其默认值。

一个最初的骨架应用项目,位于 src/app 子目录下。

*/


2. 启动应用服务器

使用顺手的开发工具(推荐VS CODE)打开项目目录,在命令行上输入:

npm start

/*

如果开发工具中使用ng命令出现如下信息:

ng : 无法加载文件 C:\Program Files\nodejs\ng.ps1。未对文件 C:\Program Files\nodejs\ng.ps1 进行数字签名。无法在当前系统上运行该脚本。


解决方案:

通过管理员权限打开 power shell 

输入:set-executionpolicy remotesigned

输入:Y

*/


3. 结构介绍

你会在这里看到 AppComponent 壳的三个实现文件:

a. app.component.ts — 组件的类代码,这是用 TypeScript 写的。

b. app.component.html — 组件的模板,这是用 HTML 写的。

c. app.component.css — 组件的私有 CSS 样式。

d. src/styles.css — 全局样式


5. 创建 HeroesComponent 新组建

cd src/app(这里根据目录分层指定)

ng generate c heroes

/* CLI 创建了一个新的文件夹 src/app/heroes/,并生成了 HeroesComponent 的四个文件。 */

打开:app/heroes/heroes.component.ts

/* 

@Component 是个装饰器函数,用于为该组件指定 Angular 所需的元数据。

CLI 自动生成了三个元数据属性:

1. selector — 组件的选择器(CSS 元素选择器)

2. templateUrl — 组件模板文件的位置。

3. styleUrls — 组件私有 CSS 样式表文件的位置。

5. ngOnInit() 是一个生命周期钩子,Angular 在创建完组件后很快就会调用 ngOnInit()。这里是放置初始化逻辑的好地方。

6. 始终要 export 这个组件类,以便在其它地方(比如 AppModule)导入它。

*/


创建 service.ts 文件

ng generate s heroes


6. 显示 HeroesComponent 组建

在 app.component.html 中增加:

<app-heroes></app-heroes>

/* app-heroes 就是 HeroesComponent 的 元素选择器。 */


7. 新建类的使用

a. 创建 Hero 类

/* 在 src/app 文件夹中为 Hero 类创建一个文件,并添加 id 和 name 属性。 */

[ src/app/hero.ts ]

export interface Hero {

  id: number;

  name: string;

}


b. 回到 HeroesComponent 类,并且导入这个 Hero 类。

[ src/app/heroes/heroes.component.ts ]

import { Component, OnInit } from '@angular/core';

新增:

import { Hero } from '../hero';


c. 初始化Hero类。进行赋值。

[ src/app/heroes/heroes.component.ts ]

export class HeroesComponent implements OnInit {

  

  /* 新增 */

  hero: Hero = {

    id: 1,

    name: 'Windstorm'

  };


  constructor() { }


  ngOnInit(): void {

  }


}


d. 显示 hero 对象

[ heroes.component.html ]

<h2>{{hero.name}} Details</h2>

<div><span>id: </span>{{hero.id}}</div>

<div><span>name: </span>{{hero.name}}</div>


8. 双向绑定

[ src/app/heroes/heroes.component.html ]

<div>

  <label for="name">Hero name: </label>

  <input id="name" [(ngModel)]="hero.name" placeholder="name">

</div>

/* [(ngModel)] 是 Angular 的双向数据绑定语法。 */

/* 注意,当你加上 [(ngModel)] 之后这个应用无法工作了。 */

打开浏览器的开发工具,就会在控制台中看到如下信息:

Template parse errors:

Can't bind to 'ngModel' since it isn't a known property of 'input'.

/*

虽然 ngModel 是一个有效的 Angular 指令,不过它在默认情况下是不可用的。

它属于一个可选模块 FormsModule,你必须自行添加此模块才能使用该指令。

*/


AppModule

/*

Angular 需要知道如何把应用程序的各个部分组合到一起,以及该应用需要哪些其它文件和库。 这些信息被称为元数据(metadata)。


有些元数据位于 @Component 装饰器中,你会把它加到组件类上。 另一些关键性的元数据位于 @NgModule 装饰器中。


最重要的 @NgModule 装饰器位于顶层类 AppModule 上。


Angular CLI 在创建项目的时候就在 src/app/app.module.ts 中生成了一个 AppModule 类。 这里也就是你要添加 FormsModule 的地方。

*/


导入 FormsModule

/* 打开 AppModule (app.module.ts) 并从 @angular/forms 库中导入 FormsModule 符号。 */

[ app.module.ts ]

import { FormsModule } from '@angular/forms';

/* 然后把 FormsModule 添加到 @NgModule 元数据的 imports 数组中,这里是该应用所需外部模块的列表。 */

imports: [

  BrowserModule,

  FormsModule

],


/*

声明 HeroesComponent

每个组件都必须声明在(且只能声明在)一个 NgModule 中。

你没有声明过 HeroesComponent,可为什么本应用却正常呢?

这是因为 Angular CLI 在生成 HeroesComponent 组件的时候就自动把它加到了 AppModule 中。

打开 src/app/app.module.ts 你就会发现 HeroesComponent 已经在顶部导入过了。

*/