Services 服务

为什么需要服务

同一个功能组件会有增、删、改,并且在不同组件中完成,而这些组件大多数会有对应的RESTful API接口,也可能这些接口返回的数据需要一定的转换。

在这样的问题之下,如果每一个组件内部自己去处理,会有大量的重复的 Http 之类的代码,在Angular中服务就是集中处理这类信息。服务本身是以单例形式存在的,所以组件间很容易可以通信,从而还能减少网络请求次数。

组件本身要获取最有效的数据,也只需要将对应的服务注入到组件树中即可。

同时对于组件可以通过Mock这些服务让组件可测试性变得异常简单。

如何创建服务

一个普通的类,加上 @Injectable() 装饰器即可:

import { Injectable } from '@angular/core';

@Injectable()
export class UserService {

    get(id: number): Observable<User> {}

    add(user: User): boolean {}

    remove(user: User): boolean {}
}

你可以在任意组件树位置中注入它。

@Coomponent({
    providers: [ UserService ]
})

由于它是单例形式,所以不管在哪个地方注入它都会可能会被另一个地方覆盖。因此,如果你的服务需要在整个应用中有效,可以直接在根模块中注入它。

@NgModule({
    providers: [ UserService ]
})

最后,在你需要用到它的组件里,直接在构造函数中表明即可。

export class AppComponent {
    constructor(private srv: UserService) { }
}

异步尽可能返回 Observable 类型

一直我都很强调 Observable 的运用,因为在 Angular 当中 Observable 就是一部分,它的强大让我们的代码看起来更优雅。

比如,上面获取用户详细 get 方法,在使用时,如果配合 async 管道,不知道有多爽。

比如:当网络请求返回后这段时间显示 【loading...】 字样,只需要这样字。

@Coomponent({
    template: `
    <p *ngIf="user$ | async as user; else loading">
        name: {{user.name}}
    </p>
    <ng-template #loading>loading...</ng-template>
    `
})
export class AppComponent {

    constructor(private srv: UserService) { }

    user: Observable<User>;
    ngOnInit() {
        this.user = this.srv.get(1);
    }
}

results matching ""

    No results matching ""