2017-03-28 91 views
4

我的應用程序中有兩項服務 - MainService和RightClickService。只有MainService可在應用程序中全局訪問,並且RightClickService被注入到MainService。因此,我定義了以下文件爲:角度2:沒有供應商(注入)服務

app.module.ts

@NgModule({ 
    declarations: [ 
    AppComponent, 
    ... 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: [MainService], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

RightClickService不app.module.ts提及。

service.ts

@Injectable() 
export class MainService { 

    constructor(private rightClickService: RightClickService) { 
    console.log("Constructor is init"); 
    } 
} 

RightClickService只存在於大的應用程序RightClickComponent內部命名一個組成部分。

右click.component.ts:

@Component({ 
    selector: 'right-click', 
    template: ` 
    ... 
    `, 
    styleUrls: ['...'], 
    providers: [RightClickService] 
}) 
export class RightClickComponent implements OnInit { 

    constructor(private rightClickService: RightClickService) {} 

} 

不過,我得到的錯誤:

EXCEPTION: No provider for RightClickService! 

你知道我在做什麼錯?

+0

更改爲'(private rightClickService:MainService)' – Bean0341

+0

什麼?爲什麼?在哪裏改變它? – CrazySynthax

+1

'MainService'無法找到'RightClickService'的提供者,因爲您不在NgModule中提供它 – yurzui

回答

6

除了什麼已經說了,你必須知道兩件事情:

  1. 您的應用程序只有一個包含在你的應用程序@NgModule.providers陣列的任何模塊,包括AppModule delcared所有供應商的根注射器。

  2. 每個組件都有其自己的注射器(根注射器的子注射器),其中包含在組件的@Component.providers數組中聲明的提供者。

時的角度想解決服務(MainService)的依賴(RightClickService)他看起來它的根注射器裏面包含了所有NgModules的供應商。

當角度想解決組件(RightClickComponent)他看起來它在組件注入的依賴(RightClickService)如果沒有找到他尋找它,如果沒有找到,他會做的部件噴油器直到他到達根注射器,如果沒有發現錯誤將被拋出。

,如果你想解決,你可以做到這一點的問題:

function MainServiceFactory(RightClickService) { 
    return new MainService(new RightClickService()); 
} 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    ... 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: [ 
    { 
    provide: MainService, 
    useFactory: MainServiceFactory, 
    deps: [RightClickService] 
    } 
], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
2

我剛拔掉它變成Plunker,除非我拼寫錯誤的東西......你有什麼似乎工作。所以也許還有其他的錯誤?

你能在這裏檢查出plunker:https://plnkr.co/edit/ea9dFs?p=info

(該工具不會讓我沒有張貼代碼...但你已經有了上面的代碼......所以我只是貼了一塊的。)

import { Injectable } from '@angular/core' 

@Injectable() 
export class RightClickService { 

    constructor() { 
    console.log("RightClickService is init"); 
    } 
}