-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) 

を投げている私も、質問のこの種に関連するStackOverflowの上のいくつかの答えを読みます角DI上thoughtramブログと以下のように@Injectを使用してサービスクラスのコンストラクタに試した: -

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

それでも、何の成功を、まだ取得同じエラー。私はここでいくつかのトリックを欠いていると確信しています。コンポーネント内で同じものを使用するときに機能しますが、サービスクラスでなぜそれが受け入れられないのか分かりません。

+0

が取るオーバーヘッドがあってはならないので、あなたが実際にアプリのデフォルトRendererを取得しているnull, nullに渡すことでこれを見てくださいhttp://stackoverflow.com/questions/34710408/renderer-cannot-be-used-in-service –

答えて

0

私は上記のコメントのStackOverflow質問に記載されているのと同様の回避策を行いました。コンポーネントクラスでは、レンダラーをインスタンス化し、それをサービスクラスのプロパティにバインドして使用します。それは機能しましたが、私はまだそれをその方法で使用することを納得していません。

0

実際のコンポーネントからサービスに渡すだけで問題なく動作します。

しかし、サービスはレンダリングロジックを配置するのではなく、ビジネスロジックを配置するために常に使用する必要があります。 良いコードの習慣に従って、常にComponent自体で処理する必要があります。

+0

私は冗長コードを避けるために複数のコンポーネントで使用できる共通クラスとして、より多くのサービスを使用しています。だから私はすべての人が共有できるサービスを作り、州を維持するのを助けることができるのです。 –

5

あなたはいつものようなRendererFactory経由レンダラを作成することができます。

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

をずっと

関連する問題