2017-05-04 54 views
-1

我面臨一個問題,並花費了很多時間調試它,但都是徒勞的。我正在嘗試在服務中使用Angular2 Renderer類方法。首先,我把它注射在類的構造函數象下面這樣: -Angular2 - 服務類別中沒有提供者錯誤

@Injectable 
    export class MyService{ 
    constructor(private renderer: Renderer, 
       private _cd: ChangeDetectorRef){} 

    myFunct(){ 
     this.renderer.setElementStyle(......); 
     } 
    ...... 
    } 

有了這個瀏覽器控制檯拋出錯誤堆棧

Error: No provider for Renderer! 
at NoProviderError.BaseError [as constructor] (http://local.xyz.com:3000/vendor.bundle.js:30912:34) 
at NoProviderError.AbstractProviderError [as constructor] (http://local.xyz.com:3000/vendor.bundle.js:28881:16) 

我讀#2幾個答案與此相關的各種問題也thoughtram博客上角DI,並試圖在服務類的構造函數使用@Inject象下面這樣: -

constructor(@Inject(Renderer) renderer : Renderer){} 

儘管如此,沒有成功,仍然得到同樣的錯誤。我相信我在這裏錯過了一些技巧。當我在一個組件中使用相同的東西時,它是有效的,我不知道爲什麼在服務類中,它不接受它。

+0

採取看看這個http://stackoverflow.com/questions/34710408/renderer-cannot-be-used-in-service –

回答

0

我做了一個類似於在上面的評論中的StackOverflow問題中提到的解決方法。在組件類中,我實例化了Renderer並將其綁定到服務類中的一個屬性,以使用它。雖然它的工作,但我仍然不相信以這種方式使用它。

0

您可以將其從實際組件傳遞到服務,它將起作用。

但是,服務並不意味着放置渲染邏輯,而應始終用於放置業務邏輯。 所以它應該始終在組件本身中按照良好的代碼慣例進行處理。

+0

我使用更多的服務作爲一個普通的類,可以在多個組件使用,以避免冗餘代碼。這就是爲什麼我創建了一個可以被所有人共享的服務,並且可以幫助維護狀態。 –

5

您可以隨時創建通過RendererFactory渲染這樣:

@Injectable 
export class MyService { 
    private renderer: Renderer2; 
    constructor(rendererFactory: RendererFactory2) { 
     this.renderer = rendererFactory.createRenderer(null, null); 
    } 
} 

通過傳遞null, null你實際上檢索默認Renderer的應用程序,所以不應該有太大的開銷

相關問題