我正在尝试在服务中使用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){}仍然没有成功,仍然得到相同的错误。我确信我在这里漏掉了一些技巧。当我在一个组件中使用相同的东西时,它是有效的,我不知道为什么它在服务类中不接受它。
发布于 2017-06-03 03:03:14
您始终可以通过RendererFactory创建渲染器,如下所示:
@Injectable
export class MyService {
private renderer: Renderer2;
constructor(rendererFactory: RendererFactory2) {
this.renderer = rendererFactory.createRenderer(null, null);
}
}通过传入null, null,您实际上是在检索应用程序的默认Renderer,因此应该不会有太多开销
发布于 2017-05-04 18:17:13
我做了一个类似于上面评论中提到的StackOverflow问题的变通方法。在component类中,我实例化了渲染器,并将其绑定到服务类中的属性以使用它。虽然它有效,但我仍然不相信以这种方式使用它。
发布于 2017-05-04 18:31:52
您只需将它从实际的组件传递给服务,它就会工作。
但是服务并不意味着要放入呈现逻辑,而应该总是用来放入业务逻辑。因此,根据良好的代码实践,应该始终在组件本身中处理它。
https://stackoverflow.com/questions/43779493
复制相似问题