服务中没有“渲染器提供程序”错误

时间:2017-05-04 09:50:23

标签: angular typescript dependency-injection angular2-services

我正在尝试在服务中使用Angular 2 Renderer类方法。

首先,我将它注入到类构造函数中,如下所示:

    @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上阅读了与此类问题相关的几个答案,以及关于Angular DI的thoughtram博客文章,并尝试在服务类构造函数中使用@Inject,如下所示:

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

仍然没有成功,仍然得到同样的错误。我相信我在这里错过了一些技巧。它在我在组件中使用相同的东西时起作用,我不知道它为什么不在服务类中接受它。

3 个答案:

答案 0 :(得分:5)

您始终可以通过RendererFactory创建渲染器:

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

通过传入null, null,您实际上正在检索应用的默认Renderer,因此不应该有很多开销

答案 1 :(得分:0)

我做了类似于上面评论中StackOverflow问题中提到的解决方法。在组件类中,我实例化了Renderer并将其绑定到服务类中的属性,以便使用它。虽然它有效,但我仍然不相信以这种方式使用它。

答案 2 :(得分:0)

您只需将其从实际组件传递到服务即可。

但是服务并不意味着放置渲染逻辑,而应始终用于放置业务逻辑。 所以它应该始终按照良好的代码实践在Component本身中处理。