angular中根模块文件构造大致如下:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { OneService } from './cart.service';
@NgModule({
imports: [
BrowserModule,
],
declarations: [
AppComponent,
],
bootstrap: [ AppComponent ],
providers: [OneService]
})
export class AppModule { }
Angular 应用都有根模块(NgModule 类),一般命名为 AppModule,在app.module.ts 的文件中。用来启动angular应用。
- import —— 从外部模块中导入该模块中的组件模板所需的类。
- export —— 将本模块中导出到其它模块的组件模板中使用的可声明对象的子集。
- declarations —— 声明属于本 NgModule 的组件、指令、管道。
- bootstrap —— 根组件(AppComponent),作为应用的主视图,是一个应用中所有其它视图的宿主。只有根模块才应该设置这个 bootstrap 属性。
- providers —— 该模块向全局服务中提供的服务创建器。 这些服务能被本应用中的任何部分使用。 可以看到上诉文件中每个 Angular 库的名称都带有 @angular 前缀。 使用 npm 可安装 Angular 的库,并import 导入所需库并加入 @NgModule 元数据的 imports 中。
@Component({
selector: 'hero-list',
templateUrl: './hero-list.component.html',
providers: [ HeroService ]
})
export class HeroListComponent implements OnInit {
/* . . . */
}
组件结构
@Component 装饰器将一个普通类变成了组件,以此告诉 Angular 到哪里获取它需要的主要构造块,以创建和展示这个组件及其视图,其中配置项有
- selector:是一个 CSS 选择器,用于选中该组件
- templateUrl:该组件的 HTML 模板文件相对于这个组件文件的地址,定义了该组件的页面显示。
- providers:当前组件所需的服务。
语法
<li>{{hero.name}}</li>
<hero-detail [hero]="hero"></hero-detail>
<input [(ngModel)]="hero.name">
<li (click)="select(hero)"></li>
- 插值: {{hero.name}} 在组件中显示hero.name 属性的值。
- [hero]属性绑定把父组件 HeroListComponent 的 selectedHero 的值传到子组件 HeroDetailComponent 的 hero 属性中。
(相当于Vue的v-bind指令) - 当用户点击某个英雄的名字时,(click) 事件绑定会调用组件的 selectHero 方法。
(相当于Vue的v-on指令) - ngModel:双向数据绑定
(相当于Vue的v-model指令)
管道
@Pipe操作符 (|)
<p>Today is {{today | date}}</p>
<p>The time is {{today | date:'shortTime'}}</p>
@Pipe 装饰器的类中会定义一个转换函数,用来把输入值转换成特定的输出值。管道操作符
指令
带有 @Directive() 装饰器的类,分为结构型指令和属性型指令
结构型指令
例如
- 迭代器*ngFor,对heroes进行迭代
- 条件语句*ngIf,当满足一定条件时,才会进行显示。
属性型指令
属性型指令有ngModel,进行双向数据绑定。 ngModel 修改现有元素设置绑定元素的属性值,并响应 change 事件。
服务
服务命名为xxx.servie.ts,在服务文件中导出一个类供全局文件进行使用,服务之间可以相互依赖引用
export class log{
log(msg:string){
console.log(msg}
}
warn(msg:string){
console.warn(msg}
}
使用服务
使用服务需将服务进行注册,注册服务的方法有三种
- 默认情况下,在Angular CLI 中输入 ng generate service 命令会在 @Injectable() 装饰器中将其注册到根注入器。
@Injectable({
providedIn: 'root',
})
- 在特定的模块注册时,该模块中的所有组件可使用该服务
@NgModule({
providers: [
log,
...
],
})
- 在组件级注册时,该组件的每一个实例都能使用注册的服务。
@Component({
selector: 'hero-list',
templateUrl: './hero-list.component.html',
providers: [ logService ]
})
依赖注入
用 @Injectable() 装饰器提供元数据,以便让服务作为依赖注入到组件中。 在组件中,angular会通过查看组件的构造函数,来决定该组件依赖于哪些服务。故使用服务时需要在constructor中进行声明