2016-04-08 29 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