2016-04-08 30 views
4

我很困惑什么时候才适合使用。Angular 2何时使用DI,提供商还是纯进口?

1.定义类静态函数,只导入和使用导入的名称,然后起作用

共享类:

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

类其使用导出类:

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

2.定义s TANDARD类,然后通过DI安装

共享类:

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

3.定义的标准类,然后装入作为提供者同时的Bootstrap:它使用导出类

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

Shared c姑娘:

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

类自举Angular2

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

类采用出口类:

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

什么是正确使用的供应商?

回答

4

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

但是,如果你正在寻找答案简单...

如果你不喜欢在你的代码提交,你会得到一个错误,因为你没有创建一个Class的实例,只是试图从构造函数调用函数。你可以重写这段代码,它会起作用,但如果你想要跟踪Angular2代码风格的最佳实践,那么这不是一个好的解决方案。

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

只是为了例如工作代码(你不应该使用此代码)

2.

我相信Angular2将返回错误。因为你不使用DI模式,只是注入类,但从来没有注册它。你会得到这样的事情:

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

所以,也许你不应该使用的代码编写这种风格太。

最后,最好的办法是使用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在多个不同的组件,你可以inject它应用的引导阶段,你不会有使用providers的每一个组件中进行注册,你只需要将其注入构造函数中,就像示例2中的那样,并且不会有错误。

希望它能帮助你!

+0

@Teddy,它涵盖了你所有的问题吗? – Mikki

+0

我必须说Angular 2注射机制对我来说感觉很奇怪。如果我必须导入注入类,那么这个DI有什么意义? DI不应该让我有可能从无法抽象出来? – Joe