加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

@Inject与构造函数注入作为Angular 2中的普通参数有什么区别?

发布时间:2020-12-17 06:56:41 所属栏目:安全 来源:网络整理
导读:我在这两个场景中有点困惑,我们使用@Injectable()装饰器标记一些类,以便它们可用于注入不同的组件.我只是想知道@Inject()和构造函数注入之间的区别是正常的. 场景1 – 使用@Inject(): @Component({ selector: 'main-app',template: ` .... {{_service.getNa
我在这两个场景中有点困惑,我们使用@Injectable()装饰器标记一些类,以便它们可用于注入不同的组件.我只是想知道@Inject()和构造函数注入之间的区别是正常的.

场景1 – 使用@Inject():

@Component({
    selector: 'main-app',template: `
        ....
        {{_service.getName()}}
        ....
    `
})
export class AppComponent{
    constructor(@Inject(AppService) private _service){}
    ....
}

场景2 – 用作Normal参数:

@Component({
    selector: 'main-app',template: `
        ....
        {{_service.getName()}}
    `
})
export class AppComponent{
    constructor(private _service:AppService){}
    ....
}

两种情况都有效,有什么区别吗?谁应该更优选?

解决方法

你真的应该只在注入令牌不是类的情况下使用@Inject.如果您不熟悉令牌是什么,它基本上是Angular用来识别要注入的内容.例如

providers: [
  AuthService,{ provide: Http,useValue: new CustomHttpImpl() }
]

这里我们有两个不同的提供者,AuthService和CustomHttpImpl.使用AuthService,令牌是AuthService.这意味着我们使用AuthService类型注入AuthService

constructor(private authService: AuthService) {}

使用此构造函数,Angular知道使用令牌AuthService查找AuthService.

在第二个提供程序中,我们提供了CustomHttpImpl,但这次我们使用了令牌Http.所以我们不能注入CustomHttpImpl,我们需要注入Http,因为那是令牌

// this will actually be the CustomHttpImpl,not Angular's Http
constructor(private http: Http)

// error: No provider for CustomHttpImpl
constructor(private http: CustomHttpImpl)

所以你可以从中看出,令牌都是类,这足以让Angular知道如何注入.

但是,假设我们有一个String或一个我们想要注入的数组.我们无法将其绑定到任何类令牌,因此我们需要创建一个人工令牌

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

let numbers = [ 1,2,3,4 ];
let config = '{ "some": "json","config": "data" }'

const NUMBERS = new OpaqueToken('app.numbers');
const CONFIG = new OpaqueToken('app.config');

现在我们有我们要注入的项目的令牌.当我们配置提供者时,我们使用这些令牌,当我们注入时,我们@Inject(TOKEN)

providers: [
  { provide: NUMBERS,useValue: numbers },{ provide: CONFIG,useValue: config }
]

constructor(@Inject(NUMBERS) numbers: number[],@Inject(CONFIG) config: string)

UPDATE

现在,使用Angular 4,我们应该使用InjectionToken而不是OpaqueToken

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读