Angular 4.2Typescript 2.3

我正在重构一个服务,该服务负责创建一个新的脚本标记并将其添加到文档中.

以下是旧代码:

loadScript(src:string){
    const script = document.createElement('script');
    document.body.appendChild(script);
    script.src = src;
}

现在,我想使用Renderer2来避免直接进行DOM操作.所以我在我的服务中注入了我需要的东西,并更新了代码:

constructor(private renderer:Renderer2, @Inject(DOCUMENT) private document){}

loadScript(src:string){
    const script = this.renderer.createElement('script');
    this.renderer.appendChild(this.document.body,script);
    script.src = src;
}

然而,我遇到了这个错误:

错误:渲染器2没有提供程序!

该服务属于一个CoreModule,其唯一导入是@angular/common中的CommonModule

This plunkr说明了这个问题

推荐答案

可能是用Using Renderer in Angular 4复制的

您不能注入Renderer2,但我们可以运行RendererFactory2@Injectable()服务中获取Renderer2实例.

获取Renderr2内部服务的实例

例如,在webworkers中有一种内部使用Angular的方式.

import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';

@Injectable()
class Service {
    private renderer: Renderer2;

    constructor(rendererFactory: RendererFactory2) {
        this.renderer = rendererFactory.createRenderer(null, null);
    }
}

在你的特殊情况下,它将是

@Injectable()
class Service {
  private renderer: Renderer2;

  constructor(rendererFactory: RendererFactory2, @Inject(DOCUMENT) private document){
    this.renderer = rendererFactory.createRenderer(null, null);
  }

  loadScript(src:string){
    const script = this.renderer.createElement('script');
    this.renderer.appendChild(this.document.body,script);
    script.src = src;
  }
}

RendererFactory2.createRenderer方法的参数为:

  • hostElementany
  • typeRendererType2|null

您可以看到这里有(null, null)个参数:

从组件传递渲染器2

// declare public property in your service
@Injectable()
class Service {
  renderer: Renderer;
}

// pass renderer to service in your component file
class App {
  name:string;
  constructor(service: Service, renderer: Renderer2) {
      service.renderer = renderer;
  }
}

Typescript相关问答推荐

如果存在一处房产,请确保存在其他房产

我可以让Typescript根据已区分的联合键缩小对象值类型吗?

处理API响应中的日期对象

使某些类型的字段变为可选字段'

如何判断输入是否是TypeScript中的品牌类型?

单击并移除for循环中的一项也会影响另一项

类型脚本中没有接口的中间静态类

如何在TypeScript中将一个元组映射(转换)到另一个元组?

访问继承接口的属性时在html中出错.角形

函数重载中的不正确TS建议

ANGLE订阅要么不更新价值,要么不识别价值变化

界面中数组中的混合类型导致打字错误

使用或属性编写无限嵌套的接口

react 路由不响应参数

使用强类型元组实现[Symbol.iterator]的类型脚本?

TaskListProps[]类型不可分配给TaskListProps类型

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

可以';t使用t正确地索引对象;联合;索引类型

Karma Angular Unit测试如何创建未解析的promise并在单个测试中解决它,以判断当时的代码是否只在解决后运行

如何将 MUI 主题对象的自定义属性与情感样式组件中的自定义props 一起使用?