2017-05-04 55 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的应用程序,所以不应该有太大的开销

相关问题