关于前端:关于-Angular-注解-Injectable-使用的一些误区

2次阅读

共计 1429 个字符,预计需要花费 4 分钟才能阅读完成。

一个常见的误会是,@Injectable() 是咱们打算在应用程序中注入组件 / 服务的任何类的必须装璜器。这种说法并不完全正确。

当应用 Angular 装璜器时,被装璜的类以 Angular 能够读取的格局存储对于本身的元数据——这包含对于它须要获取和注入哪些依赖项的元数据。

如果一个类上没有应用 Angular 装璜器,那么 Angular 就无奈读取它须要的依赖项。这就是咱们须要应用 @Injectable() 的起因。

如果咱们的服务注入提供者,咱们必须增加 @Injectable(),这个注解除了通知 Angular 存储它须要的元数据之外,没有实现其余额定的性能。

假如咱们有上面这个 Service class:

export class UserService {isAuthenticated(): boolean {return true;}
}

对于下面这个类,咱们不须要用 @Injectable 装璜它,以便可能将其注入到组件中。因为 UserService 自身不注入任何 providers.

然而如果咱们的 Service 类自身又注入了其余的依赖:

import {Http} from '@angular/http';

export class UserService {constructor(private http: Http) {}
  isAuthenticated(): Observable<boolean> {return this.http.get('/api/user').map((res) => res.json());
  }
}

下面的代码无奈失常工作,因为 Http 提供程序元数据不会被存储以供 Angular 正确组合。

解决方案就是应用 @Injectable 注解:

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

@Injectable()
export class UserService {constructor(private http: Http) {}
  isAuthenticated(): Observable<boolean> {return this.http.get('/api/user').map((res) => res.json());
  }
}

SAP Spartacus 的例子:

对于用于 DI 的管制反转 (IOC) 容器,开发人员通常须要实现两种设置。首先是令牌。要向 IOC 容器注册依赖,须要提供一个令牌。令牌是注册任何服务的举世无双的标识符。第二件事是配置 provider 自身。提供者帮忙 DI 容器创立特定依赖项的运行时实例。

在 Angular 中,应用令牌注册服务,并将其传递给提供者的具体方法如下所述:

首先,能够应用特定的 @NgModule 注册服务。该过程是通过将服务传递给提供者数组来进行注册。上面是一个例子,应用的令牌是 typescript 类型 MyService. 这里的提供者是 useClass. 这个提供者策略,告诉 Angular DI 框架,能够通过 new 关键字来实例化某个依赖项。

例子代码:

@NgModule({
  ...
  providers: [
    // long hand syntax
      {provide: MyService, useClass: MyService},
      // short hand syntax
      MyService
  ],
})

留神下面提供了两种语法,因为 provide 和 useClass 指向的 type 定义雷同,所以能够间接简写成 MyService.

正文完
 0