Angular 2何时使用DI,提供商或纯粹导入?

时间:2016-04-08 07:59:40

标签: angular typescript dependency-injection import

我很困惑什么时候适当使用什么。

1。使用静态函数定义类,只需导入并使用导入的名称,然后运行

共享课程:

export class SomeClass {
   static someFunction(){
      ...
   }
}

使用导出类的类:

import { SomeClass } from './someclassstatic'
...
constructor(){
    SomeClass.someFunction()
}

2。定义标准类,然后通过DI

安装

共享课程:

export class SomeClassDI {
   public someFunctionDI(){
      ...
   }
}

使用导出类的类:

import { SomeClassDI } from './someclassdi'
...
constructor(private theclassdi:SomeClassDI){
    this.theclassdi.someFunction()
}

3。定义标准类,然后在引导时挂载

共享课程:

export class SomeClassBS {
   public someFunctionBS(){
      ...
   }
}

引导Angular2的类

import { SomeClassBS } from './someclassbs'
...
bootstrap(AppComponent, [SomeClassBS]);

使用导出类的类:

??? I am not sure what can be the example here. 

提供者的正确使用是什么?

1 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。 首先,我建议你阅读这篇文章Dependency Injection in Angular 2

但如果您正在寻找简短回答......

<强> 1

如果您将在代码中显示,则会出现错误,因为您不创建Class的实例,而只是尝试从构造函数调用函数。您可以重写此代码,它可以工作,但如果您想要跟进Angular2代码样式的最佳实践,它不是很好的解决方案。

import { SomeClass } from './someclassstatic'
...
constructor(){
    let someClass = new SomeClass();
    someClass.someFunction()
}

仅举例说明工作代码(不应使用此代码)

<强> 2

我相信Angular2会给你回复错误。因为你不使用DI模式,只是注入类但从未注册它。你会得到这样的东西:

EXCEPTION: No provider for SomeClass! (AppComponent -> SomeClass)

所以,你可能也不应该使用这种编写代码的方式。

第3

最后,最好的方法是在您的应用程序中使用DI模式。如果您要在此组件中仅使用service一次,则可以将其包含在组件注释的providers属性中。

@Component({
    selector: 'my-app',
    templateUrl: 'app/app.partial.html',
    providers: [SomeClass]
})
export class AppComponent {
    constructor(private someClass: SomeClass) {
        this.someClass.someFunction();
    }
}

如果您打算在多个不同的组件中使用service,那么您可以在应用程序的Bootstrap阶段inject使用它,而不必在每个组件中注册它使用providers,您只需要在构造函数中将其注入,如示例2中所示,并且不会出现错误。

希望它会对你有所帮助!