1. 使用引用符来格式化HTML代码。

  1. @Component({
  2. selector: 'app-heroes',
  3. templateUrl: './heroes.component.html',
  4. styleUrls: ['./heroes.component.css']
  5. })

2. 数据双向绑定方式。

在使用表单输入绑定数据之前,我们需要引入表单模块FormsModule包至我们的Angular模块中。引入包的方法是,直接添加需要的包至NgModelimports数组中。

  1. import { BrowserModule } from '@angular/platform-browser';
  2. import { NgModule } from '@angular/core';
  3. import { FormsModule } from '@angular/forms';
  4.  
  5. import { AppComponent } from './app.component';
  6. import { HeroesComponent } from './heroes/heroes.component';
  7.  
  8. @NgModule({
  9. declarations: [
  10. AppComponent,
  11. HeroesComponent
  12. ],
  13. imports: [
  14. BrowserModule,
  15. FormsModule
  16. ],
  17. providers: [],
  18. bootstrap: [AppComponent]
  19. })
  20. export class AppModule { }

表单中写法:

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

3.使用自定义对象数组

  1. const HEROES: Hero[] = [
  2.    {id: 11, name: 'Mr.Nice'},
  3. {id: 12, name: 'Narco'},
  4. {id: 13, name: 'Bombasto'},
  5. {id: 14, name: 'Celeritas'},
  6. {id: 15, name: 'Magneta'},
  7. {id: 16, name: 'RubberMan'},
  8. {id: 17, name: 'Dynama'},
  9. {id: 18, name: 'Dr IQ'},
  10. {id: 19, name: 'Magma'},
  11. {id: 20, name: 'Tornado'}
  12. ];

4.使用列表li

  1. <li *ngFor="let hero of heroes">
  2. <span class="badge">{{hero.id}}</span>
  3. {{hero.name}}
  4. </li>

5.为组件添加样式

  1. @Component({
  2. selector: 'my-app',
  3. template: ``,
  4. styles: [`
  5. .selected {
  6. background-color: #CFD8DC;
  7. color:white;
  8. }
  9. .heroes {
  10. margin: 0 0 2em 0;
  11. list-style-type: none;
  12. padding: 0;
  13. width: 15em;
  14. }
  15. `]
  16. }]

6.定义变量

与Java/C++定义变量的类型写在前面不同的时,TypeScript的定义方式为

变量名:类型

  1. selectedHero:Hero;

7.定义方法

必须定义返回类型

  1. onSelect(hero: Hero): void {
  2. this.selectedHero = hero;
  3. }

8.使用结构指令

直接使用某个可能为空的变量,会导致异常抛出,需要使用if结构进行判断。angular中有一种名为结构指令(structural directives)可以改变DOM的结构。这类的指令有ngIfngFor。用法如下:

  1. <div *ngIf="selectedHero">
  2. <h2>{{selectedHero.name}} details!</h2>
  3. <div><label>id:</label>{{selectedHero.id}}</div>
  4. <div><label>name:</label>{{selectedHero.name}}</div>
  5. </div>

9.改变组件的CSS样式类

[class.className]=true/false

key为样式的类名,value为true或者false.应用:已选择的项添加已选择样式。未选择的项消除已选择样式

  1. <li *ngFor="let hero of heroes" (click)="onSelect(hero)" [class.selected]="hero === selectedHero">
  2. <span class="badge">{{hero.id}}</span>
  3. {{hero.name}}
  4. </li>

10.引入类

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

11.使用服务Service

使用@Injectable修饰类

  1. import {Injectable} from '@angular/core';
  2.  
  3. import {HEROES} from "./mock-heroes";
  4. import {Hero} from "./hero";
  5.  
  6. @Injectable()
  7. export class HeroServie {
  8. getHeroes(): Hero[] {
  9. return HEROES
  10. }
  11.  
  12. }

如何在组件中使用这个服务?传统的方式会使用new关键字去实例化。但官方不建议这么做,有以下几点理由:

  • 当服务类的构造方法改变时,我们必须要修改每一处使用到它的代码

  • 如果需要缓存对象的状态,每次都new是做不到的。

  • 在代码中写死new类来实例化,将无法替换其实现。比如,测试环境和生产环境的服务可能不同,当要切换不同版本是比较麻烦的。

官方推荐使用注入来使用服务。为组件添加providers元数据。

  1. providers: [HeroServie],

组件的构造方法改为:

  1. constructor(private heroService: HeroServie) {
  2. this.heroes = heroService.getHeroes();
  3. }

12.使用ngOnInit生命周期回调接口

angular提供了一系统的接口监控组件的生命周期各个环节。

  1. import { OnInit } from '@angular/core';
  2.  
  3. export class AppComponent implements OnInit {
  4.  
  5. ngOnInit(): void {
  6.  
  7. // somthing to be done
  8.  
  9. }
  10.  
  11. }

13. 使用Promise解决回调的问题

服务有时候是耗时的操作,如果直接调用可能会阻塞UI,使用Promise可以解决这个问题。

  1. @Injectable()
  2. export class HeroServie {
  3. getHeroes(): Promise<Hero[]> {
  4. return Promise.resolve(HEROES);
  5. }
  6.  
  7. }
  1. private getHeroes() : void {
  2. this.heroService.getHeroes().then(heroes => this.heroes = heroes);
  3. }

14.使用路由Routing

路由配置文件写法

  1. import {Routes, RouterModule} from "@angular/router";
  2. import {ModuleWithProviders} from "@angular/core";
  3. import {HeroesComponent} from "./heroes.component";
  4.  
  5. const appRoutes: Routes = [{
  6. path: 'heroes',
  7. component: HeroesComponent
  8. }];
  9.  
  10. export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);

模板中使用

  1. <a routerLink="/heroes">Heroes</a>
  2. <router-outlet></router-outlet>

routerLink指令告知路由器点击跳转至哪个地址,<router-outlet></router-outlet>表示路由出口,即要把组件(routerLink指向的组件)加载在哪个位置.

15.使用templateUrl代替template

  1. @Component({
  2. selector: 'my-dashboard',
  3. templateUrl: 'app/dashboard.component.html'
  4. })

16.按下标显示数组中的指定记录

  1. this.heroService.getHeroes().then(heroes=>this.heroes = heroes.slice(1, 5));

17.参数化路由

路由配置:id为参数

  1. {
  2. path: 'detail/:id',
  3. component: HeroDetailComponent
  4. }

获取参数:

  1. export class HeroDetailComponent implements OnInit {
  2. ngOnInit(): void {
  3. this.route.params.forEach((params: Params)=> {
  4. let id = +params['id']; //加号的作用是将字符串参数转化为数字
  5. this.heroService.getHero(id).then(hero => this.hero = hero);
  6. });
  7. }
  8.  
  9. constructor(private heroService: HeroServie,
  10. private route: ActivatedRoute) {
  11.  
  12. }
  13.  
  14. @Input()
  15. hero: Hero;
  16.  
  17. }

18.代码中转向

  1. gotoDetail(hero: Hero): void {
  2. let link = ['/detail', hero.id];
  3. this.router.navigator(link);
  4. }

19. 使用内在Web API模拟HTTP服务

内存数据模拟数据库数据。

  1. InMemoryWebApiModule.forRoot(InMemoryDataService),

service实现

  1. import {InMemoryDbService} from "angular2-in-memory-web-api";
  2.  
  3. export class InMemoryDataService implements InMemoryDbService {
  4. createDb(): {} {
  5. let heroes = [
  6. {id: 11, name: 'Mr. Nice'},
  7. {id: 12, name: 'Narco'},
  8. {id: 13, name: 'Bombasto'},
  9. {id: 14, name: 'Celeritas'},
  10. {id: 15, name: 'Magneta'},
  11. {id: 16, name: 'RubberMan'},
  12. {id: 17, name: 'Dynama'},
  13. {id: 18, name: 'Dr IQ'},
  14. {id: 19, name: 'Magma'},
  15. {id: 20, name: 'Tornado'}
  16. ]
  17. return heroes;
  18. }
  19.  
  20. }

HTTP请求示例

  1. getHeroes(): Promise<Hero[]> {
  2. return this.http
  3. .get(this.heroesUrl)
  4. .toPromise()
  5. .then(response => response.json().data as Hero[]) // 转换类型
  6. .catch(this.handleError)
  7. }

20.使用HTTP Promise

Angular的http.get返回的是Observable,Observables是一个强大的管理异步数据流的方式。

当我们使用toPromise方法将Observables转化为Promise后,操作就像操作普通的Promise一样。使用toPromise方法需要引入外部方法

  1. import 'rxjs/add/operator/toPromise';

21.HTTP请求异常处理

  1. .catch(this.handleError);
  1. private handleError(error: any): Promise<any> {
  2.  
  3. console.error('An error occurred', error); // for demo purposes only
  4.  
  5. return Promise.reject(error.message || error);
  6.  
  7. }

angular体系

angular体系主要包括:模块Module,组件Component,模板Template,元数据Metadata,数据绑定Data Banding,服务Service,指令,依赖注入

  1. 模块是ES6标准之一,每个模块目的性非常单一。在Angular中,一般模块输出的都是一个组件类,需要配合import来加载模块。

    有一类模块是Angular本身定义好的,即库模块,当加载angular2/core模块时,可以调用一个核心类库。库模块入要有angular/core(核心类库),angular/http(网络请求相关),angular2/router(路由相关),angular2/common(表单、指令等)

    1. 总结 - Angular应用由模块组成
    2.  
    3.      - 模块输出可以是:类、函数、值或其他模块
  1. 组件是为了控制显示把HTML模板及样式。一般,每个组件都配有一个类,用来定义业务能力。通过类的属性和方法与视图进行交互。

  2. 模板是为了告知Angular如何去渲染组件。Angular模板有其特殊的语法。

  3. 元数据是告知Angular如何处理一个类。一个类如果没有元数据的声明,就是一个无法单独运行的普通的类。可以使用注解来定义类的元数据。如@Component,注解中可以带上一些参数:

    1. - selector - CSS选择器
    2.  
    3. - templateUrl - 的模板地址
    4.  
    5. - directives - 指令或组件数组
    6.  
    7. - providers - 注册的Service服务数组,从而在组件类构造函数中能够正确的实例化这些服务

    除了@Component外,还有Injectable,@Input,@Output,@RouterConfig元数据。

    1. 数据绑定是一种协调组件与模板之间的通信机制,通过HTML元素来描述采用哪种数据绑定形式。数据绑定包括属性绑定[hero]、事件绑定(click)、双向绑定[(ngModel)]="hero.name"

    2. 指令。一个指令是由元数据和一个类组成,使用元数据注解@Directive修饰就是一个指令。指令和组件的功能类似,他们的区别是指令侧重对HTML元素功能的扩展。而组件是一个具体一的业务。指令分为结构性指令如*ngFor,*ngIf等和属性指令,如[(ngModel)]

    3. 服务。模块中需要使用到的值、函数都可以是服务Service。服务通常 是一个目的性非常明确的类。如日志Service,数据Service,应用程序配置信息,工资计算器等 。

      组件是是服务的最大消费者,组件都是靠服务来处理大部分事务,组件不会直接从服务器获取数据、不验证用户输入,都是委派验服务来完成。一般我们遵循的原则是:把应用程序逻辑转化成服务 ,并通过依赖注入提供组件来消费服务。

    4. 依赖注入。依赖注入是一种对类实例的新方法。我们可以在引导应用程序启动时实例一个服务如

      1. bootstrap(AppComponent, [BackendService, HeroService, Logger]);

      或者在组件级别里注册服务

      1. @Component({
      2. providers: [HeroService]
      3. })
      4. export class HeroesComponent { ... }
Angular2入门导向笔记
2016年09月13日 16:55:20

阅读数:1753

1. 使用引用符来格式化HTML代码。

  1. @Component({
  2. selector: 'my-app',
  3. template: `<h1>{{title}}</h1>
  4. <h2>{{hero.name}} details!</h2>
  5. <div><label>id:</label>{{hero.id}}</div>
  6. <div><label>name:</label>{{hero.name}}</div>`
  7. })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 数据双向绑定方式

在使用表单输入绑定数据之前,我们需要引入表单模块FormsModule包至我们的Angular模块中。引入包的方法是,直接添加需要的包至NgModelimports数组中。

  1. import {NgModule} from '@angular/core';
  2. import {BrowserModule} from '@angular/platform-browser';
  3. import {AppComponent} from './app.component';
  4. import {FormsModule} from "@angular/forms";
  5. @NgModule({
  6. imports: [
  7. BrowserModule,
  8. FormsModule
  9. ],
  10. declarations: [AppComponent],
  11. bootstrap: [AppComponent]
  12. })
  13. export class AppModule {
  14. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

表单中写法:

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

3.使用自定义对象数组

  1. const HEROES: Hero[] = [
  2. {id: 11, name: 'Mr.Nice'},
  3. {id: 12, name: 'Narco'},
  4. {id: 13, name: 'Bombasto'},
  5. {id: 14, name: 'Celeritas'},
  6. {id: 15, name: 'Magneta'},
  7. {id: 16, name: 'RubberMan'},
  8. {id: 17, name: 'Dynama'},
  9. {id: 18, name: 'Dr IQ'},
  10. {id: 19, name: 'Magma'},
  11. {id: 20, name: 'Tornado'}
  12. ];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.使用列表li

  1. <li *ngFor="let hero of heroes">
  2. <span class="badge">{{hero.id}}</span>
  3. {{hero.name}}
  4. </li>
  • 1
  • 2
  • 3
  • 4

5.为组件添加样式

  1. @Component({
  2. selector: 'my-app',
  3. template: ``,
  4. styles: [`
  5. .selected {
  6. background-color: #CFD8DC;
  7. color:white;
  8. }
  9. .heroes {
  10. margin: 0 0 2em 0;
  11. list-style-type: none;
  12. padding: 0;
  13. width: 15em;
  14. }
  15. `]
  16. }]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

6.定义变量

与Java/C++定义变量的类型写在前面不同的时,TypeScript的定义方式为

变量名:类型

  1. selectedHero:Hero;
  • 1

7.定义方法

必须定义返回类型

  1. onSelect(hero: Hero): void {
  2. this.selectedHero = hero;
  3. }
  • 1
  • 2
  • 3

8.使用结构指令

直接使用某个可能为空的变量,会导致异常抛出,需要使用if结构进行判断。angular中有一种名为结构指令(structural directives)可以改变DOM的结构。这类的指令有ngIfngFor。用法如下:

  1. <div *ngIf="selectedHero">
  2. <h2>{{selectedHero.name}} details!</h2>
  3. <div><label>id:</label>{{selectedHero.id}}</div>
  4. <div><label>name:</label>{{selectedHero.name}}</div>
  5. </div>
  • 1
  • 2
  • 3
  • 4
  • 5

9.改变组件的CSS样式类

[class.className]=true/false

key为样式的类名,value为true或者false.应用:已选择的项添加已选择样式。未选择的项消除已选择样式。

  1. <li *ngFor="let hero of heroes" (click)="onSelect(hero)" [class.selected]="hero === selectedHero">
  2. <span class="badge">{{hero.id}}</span>
  3. {{hero.name}}
  4. </li>
  • 1
  • 2
  • 3
  • 4

10.引入类

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

11.使用服务Service

使用@Injectable修饰类

  1. import {Injectable} from '@angular/core';
  2. import {HEROES} from "./mock-heroes";
  3. import {Hero} from "./hero";
  4. @Injectable()
  5. export class HeroServie {
  6. getHeroes(): Hero[] {
  7. return HEROES
  8. }
  9. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如何在组件中使用这个服务?传统的方式会使用new关键字去实例化。但官方不建议这么做,有以下几点理由:

  • 当服务类的构造方法改变时,我们必须要修改每一处使用到它的代码

  • 如果需要缓存对象的状态,每次都new是做不到的。

  • 在代码中写死new类来实例化,将无法替换其实现。比如,测试环境和生产环境的服务可能不同,当要切换不同版本是比较麻烦的。

官方推荐使用注入来使用服务。为组件添加providers元数据。

  1. providers: [HeroServie],
  • 1

组件的构造方法改为:

  1. constructor(private heroService: HeroServie) {
  2. this.heroes = heroService.getHeroes();
  3. }
  • 1
  • 2
  • 3

12.使用ngOnInit生命周期回调接口

angular提供了一系统的接口监控组件的生命周期各个环节。

  1. import { OnInit } from '@angular/core';
  2. export class AppComponent implements OnInit {
  3. ngOnInit(): void {
  4. // somthing to be done
  5. }
  6. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

13. 使用Promise解决回调的问题

服务有时候是耗时的操作,如果直接调用可能会阻塞UI,使用Promise可以解决这个问题。

  1. @Injectable()
  2. export class HeroServie {
  3. getHeroes(): Promise<Hero[]> {
  4. return Promise.resolve(HEROES);
  5. }
  6. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. private getHeroes() : void {
  2. this.heroService.getHeroes().then(heroes => this.heroes = heroes);
  3. }
  • 1
  • 2
  • 3

14.使用路由Routing

路由配置文件写法

  1. import {Routes, RouterModule} from "@angular/router";
  2. import {ModuleWithProviders} from "@angular/core";
  3. import {HeroesComponent} from "./heroes.component";
  4. const appRoutes: Routes = [{
  5. path: 'heroes',
  6. component: HeroesComponent
  7. }];
  8. export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

模板中使用

  1. <a routerLink="/heroes">Heroes</a>
  2. <router-outlet></router-outlet>
  • 1
  • 2

routerLink指令告知路由器点击跳转至哪个地址,<router-outlet></router-outlet>表示路由出口,即要把组件(routerLink指向的组件)加载在哪个位置.

15.使用templateUrl代替template

  1. @Component({
  2. selector: 'my-dashboard',
  3. templateUrl: 'app/dashboard.component.html'
  4. })
  • 1
  • 2
  • 3
  • 4

16.按下标显示数组中的指定记录

  1. this.heroService.getHeroes().then(heroes=>this.heroes = heroes.slice(1, 5));
  • 1

17.参数化路由

路由配置:id为参数

  1. {
  2. path: 'detail/:id',
  3. component: HeroDetailComponent
  4. }
  • 1
  • 2
  • 3
  • 4

获取参数:

  1. export class HeroDetailComponent implements OnInit {
  2. ngOnInit(): void {
  3. this.route.params.forEach((params: Params)=> {
  4. let id = +params['id']; //加号的作用是将字符串参数转化为数字
  5. this.heroService.getHero(id).then(hero => this.hero = hero);
  6. });
  7. }
  8. constructor(private heroService: HeroServie,
  9. private route: ActivatedRoute) {
  10. }
  11. @Input()
  12. hero: Hero;
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

18.代码中转向

  1. gotoDetail(hero: Hero): void {
  2. let link = ['/detail', hero.id];
  3. this.router.navigator(link);
  4. }
  • 1
  • 2
  • 3
  • 4

19. 使用内在Web API模拟HTTP服务

内存数据模拟数据库数据。

  1. InMemoryWebApiModule.forRoot(InMemoryDataService),
  • 1

service实现

  1. import {InMemoryDbService} from "angular2-in-memory-web-api";
  2. export class InMemoryDataService implements InMemoryDbService {
  3. createDb(): {} {
  4. let heroes = [
  5. {id: 11, name: 'Mr. Nice'},
  6. {id: 12, name: 'Narco'},
  7. {id: 13, name: 'Bombasto'},
  8. {id: 14, name: 'Celeritas'},
  9. {id: 15, name: 'Magneta'},
  10. {id: 16, name: 'RubberMan'},
  11. {id: 17, name: 'Dynama'},
  12. {id: 18, name: 'Dr IQ'},
  13. {id: 19, name: 'Magma'},
  14. {id: 20, name: 'Tornado'}
  15. ]
  16. return heroes;
  17. }
  18. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

HTTP请求示例

  1. getHeroes(): Promise<Hero[]> {
  2. return this.http
  3. .get(this.heroesUrl)
  4. .toPromise()
  5. .then(response => response.json().data as Hero[]) // 转换类型
  6. .catch(this.handleError)
  7. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

20.使用HTTP Promise

Angular的http.get返回的是Observable,Observables是一个强大的管理异步数据流的方式。

当我们使用toPromise方法将Observables转化为Promise后,操作就像操作普通的Promise一样。使用toPromise方法需要引入外部方法。

  1. import 'rxjs/add/operator/toPromise';
  • 1
  • 2

21.HTTP请求异常处理

  1. .catch(this.handleError);
  • 1
  • 2
  1. private handleError(error: any): Promise<any> {
  2. console.error('An error occurred', error); // for demo purposes only
  3. return Promise.reject(error.message || error);
  4. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

angular体系

angular体系主要包括:模块Module,组件Component,模板Template,元数据Metadata,数据绑定Data Banding,服务Service,指令,依赖注入

  1. 模块是ES6标准之一,每个模块目的性非常单一。在Angular中,一般模块输出的都是一个组件类,需要配合import来加载模块。

    有一类模块是Angular本身定义好的,即库模块,当加载angular2/core模块时,可以调用一个核心类库。库模块入要有angular/core(核心类库),angular/http(网络请求相关),angular2/router(路由相关),angular2/common(表单、指令等)

  1. - Angular应用由模块组成
  2. - 模块输出可以是:类、函数、值或其他模块
  • 1
  • 2
  • 3
  1. 组件是为了控制显示把HTML模板及样式。一般,每个组件都配有一个类,用来定义业务能力。通过类的属性和方法与视图进行交互。

  2. 模板是为了告知Angular如何去渲染组件。Angular模板有其特殊的语法。

  3. 元数据是告知Angular如何处理一个类。一个类如果没有元数据的声明,就是一个无法单独运行的普通的类。可以使用注解来定义类的元数据。如@Component,注解中可以带上一些参数:

  1. - selector - CSS选择器
  2. - templateUrl - 的模板地址
  3. - directives - 指令或组件数组
  4. - providers - 注册的Service服务数组,从而在组件类构造函数中能够正确的实例化这些服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

除了@Component外,还有Injectable,@Input,@Output,@RouterConfig元数据。

  1. 数据绑定是一种协调组件与模板之间的通信机制,通过HTML元素来描述采用哪种数据绑定形式。数据绑定包括属性绑定[hero]、事件绑定(click)、双向绑定[(ngModel)]="hero.name"

  2. 指令。一个指令是由元数据和一个类组成,使用元数据注解@Directive修饰就是一个指令。指令和组件的功能类似,他们的区别是指令侧重对HTML元素功能的扩展。而组件是一个具体一的业务。指令分为结构性指令如*ngFor,*ngIf等和属性指令,如[(ngModel)]

  3. 服务。模块中需要使用到的值、函数都可以是服务Service。服务通常 是一个目的性非常明确的类。如日志Service,数据Service,应用程序配置信息,工资计算器等 。

    组件是是服务的最大消费者,组件都是靠服务来处理大部分事务,组件不会直接从服务器获取数据、不验证用户输入,都是委派验服务来完成。一般我们遵循的原则是:把应用程序逻辑转化成服务 ,并通过依赖注入提供组件来消费服务。

  4. 依赖注入。依赖注入是一种对类实例的新方法。我们可以在引导应用程序启动时实例一个服务如

  1. bootstrap(AppComponent, [BackendService, HeroService, Logger]);
  • 1

或者在组件级别里注册服务

  1. @Component({
  2. providers: [HeroService]
  3. })
  4. export class HeroesComponent { ... }
  • 1
  • 2
  • 3
  • 4
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/joson793847469/article/details/52527454

Angular2、4入门基础知识(小的概念)的更多相关文章

  1. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  2. Linux入门基础知识

    注:内容系兄弟连Linux教程(百度传课:史上最牛的Linux视频教程)的学习笔记. Linux入门基础知识 1. Unix和Linux发展历史 二者就像父子关系,当然Unix是老爹.1965年,MI ...

  3. React Native 入门基础知识总结

    中秋在家闲得无事,想着做点啥,后来想想,为啥不学学 react native.在学习 React Native 时, 需要对前端(HTML,CSS,JavaScript)知识有所了解.对于JS,可以看 ...

  4. Greenplum入门——基础知识、安装、常用函数

    Greenplum入门——基础知识.安装.常用函数 2017年10月08日 22:03:09 在咖啡里溺水的鱼 阅读数:8709    版权声明:本文为博主原创,允许非商业性质转载但请注明原作者和出处 ...

  5. java基础知识小小结

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  6. USB入门基础知识(转)

    源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...

  7. 1)Linux程序设计入门--基础知识

    )Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 会学到以下内容: 源程序编译 Makef ...

  8. JavaSE 基础知识(常识概念 + 基础语法)问答总结/面试题 —— 讲给应届生的 Java 开源知识项目

    写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...

  9. React入门---基础知识-大纲-1

    -----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...

  10. PHP基础入门(二)---入门基础知识必备

    前言 在上一章中,我们初步了解了PHP的网页基础和PHP的入门基础,今天继续给大家分享更多有关PHP的知识. 理论知识看起来可能比较枯燥一些,但是我们的实践(敲代码)毕竟离不开它. 只有理论与实践相结 ...

随机推荐

  1. JavaScript Succinctly 读后笔记

    1.JavaScript does not have block scope  2.Scope is determined during function definintion,  not invo ...

  2. Django 解答 01 (pycharm创建项目)

    pycharm创建项目 1. 2. 3.Tools --->Deployment--->Options 这一条由always 改为 On explicit save action(Ctrl ...

  3. 【笔记】Pandas分类数据详解

    [笔记]Pandas分类数据详解 Pandas  Pandas分类数据详解|轻松玩转Pandas(5) 参考:Pandas分类数据详解|轻松玩转Pandas(5)

  4. Codeforces-C-Nice Garland(枚举+暴力)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  5. php内置web server

    今天刚开始正式学习PHP(之前有一点了解),推荐学习的网站是w3school.一开始不知道tomcat服务器不支持PHP脚本,直接把.php文件放到tomcat里面去运行,结果嵌入的php代码段没有什 ...

  6. centos7博客的基础搭建(LNMP)

    linux [root@zbb wordpress]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) nginx echo ...

  7. sql CET实现循环

    表结构 CREATE TABLE city( id INT IDENTITY(1,1) PRIMARY KEY, NAME NVARCHAR(100), ParentID INT , Parents ...

  8. centos7安装与卸载软件

    安装 yum install 服务名 查看服务名 rpm -qa |grep -i aerospike 或者 yum list installed | grep aerospike 卸载 yum re ...

  9. python练习六十四:EXCEL文件处理

    假设要读取number.txt文件中内容,code.txt文件内容如下 [ [1,2,3], [4,5,6], [7,8,9] ] 数据写入表格,如图 写文件(如果有文件,那直接调用就行,我这里自己先 ...

  10. shell脚本学习(1)

    格式: #!/bin/bash                              :标志一个shell脚本 #Filename:first_shell.sh          :文件名称 #a ...