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

什里

在这两种情况下,我有点困惑,我们使用@Injectable()装饰器标记某些类,以便它们可用于注入到不同的组件。我只想知道@Inject()构造函数注入之间的正常区别是什么

方案1-使用@Inject():

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

方案2-用作普通参数:

@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使用token查找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');

现在我们有了要注入的物品的代币。当配置时providers,我们使用这些标记,而在注入时,我们使用@Inject(TOKEN)

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

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

更新

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript 中的“构造函数”、“静态”和常规接口有什么区别?

主函数和常规函数有什么区别?

lambda和常规函数之间的python有什么区别?

lambda和常规函数之间的python有什么区别?

在Kotlin的构造函数中向参数添加私有修饰符有什么区别?

没有@Inject构造函数的ViewModel的Dagger2注入

如何使用构造函数参数将Inject()注入类?

Angular 2中的(click)和(ngSubmit)有什么区别

Angular 2中的OnChanges和DoCheck有什么区别?

这两种类型的php中的构造函数注入有什么区别?

在CommaIDE中,将cro服务作为常规脚本运行与将其作为cro服务运行有什么区别?

$ this-> getRequest()和在Symfony 2中将Request作为参数传递之间有什么区别

箭头函数和React函数组件(不再使用类组件)中的常规函数之间有什么区别?

Spring:如何注入 Supplier<String> 函数作为构造函数参数

类构造函数和函数参数中命名参数的默认值的“:”和“=”有什么区别

在 C++ struct 中,构造函数中的默认值和默认参数有什么区别?

在构造函数中使用多个接口作为参数的依赖注入

Angular 2依赖注入-独立于构造函数注入对象

通过构造函数注入和使用Guice通过字段注释注入之间有什么区别?

PyQt5中“ self”作为参数有什么区别

将python中的ffill作为链接方法和参数之间有什么区别?

复制构造函数/复制分配与常规函数调用优化在编译中有什么区别吗?

ViewModelProvider构造函数有什么区别

在TypeScript中显式键入通用函数参数与隐式键入之间有什么区别?

Swift中的“变异”函数和“输入”参数之间有什么区别吗?

箭头运算符VS在函数中传递参数:有什么区别?

当整数,字符串和数组作为JavaScript中的函数参数传递时,有什么区别

F#是否提供函数参数-有什么区别

Swift:用'!'定义函数参数有什么区别吗?