当前位置:  开发笔记 > 后端 > 正文

渲染器不能用于服务?

如何解决《渲染器不能用于服务?》经验,为你挑选了2个好方法。

是否可以在服务中使用Renderer或仅在组件中使用?

如果我将渲染器注入服务器,则会出现错误,即Renderer提供程序丢失.

请参阅plunker的控制台:

import {Injectable, Component, Renderer, ElementRef} from 'angular2/core';

@Injectable()
class TestService {
  constructor(
    private _renderer: Renderer
    ) {}

  renderElement(elementRef: any) {
    this._renderer.createElement(elementRef.nativeElement, 'div');
  }
}

http://plnkr.co/edit/e8qlznCVbvZnXbLTk36z?p=preview



1> Eugene Gavri..:

可能与Angular 4中的使用渲染器重复

你不能注入Renderer2,但我们可以运行RendererFactory2来获取服务中的Renderer2实例@Injectable().有两种不同的方法可以解决这个问题.

在Service中获取Renderer2的实例

例如,Angular在网络工作者内部使用的方式.我用下面的代码解决了这个问题:

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

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

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

RendererFactory2.createRenderer方法参数是:

hostElement 与类型 any

type 与类型 RendererType2|null

您可以(null, null)在此处看到参数:https: //github.com/angular/angular/blob/e3140ae888ac4037a5f119efaec7b1eaf8726286/packages/core/src/render/api.ts#L129

从组件传递Renderer2

// 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;
  }
}


@PedroArantes这不是反对Angular的方式,我在生产中使用它.解决方案之间的唯一区别是首先创建新渲染器,第二个使用现有实例.两者都使用公共库方法.同样`RendererFactory2`在Angular内部用于相同的建议.

2> Langley..:

是的,就像埃里克(Eric)所说的那样,您可以将其从实际组件传递到服务,然后它将起作用。

但是,呈现对象的责任是组件而非服务的责任,服务是用来处理业务逻辑的(主要是检索数据,具体取决于您的应用程序)。

整个想法是,如果您更改了演示文稿框架/库或任何与演示文稿有关的内容,则可以重用整个服务层。如果您执行类似的操作,则会将服务耦合到演示文稿,从而使制作工作变得更加困难稍后更改。

如果要在组件之间重用渲染逻辑,我将使用该逻辑创建一个父抽象类,并使用Component对其进行扩展,子组件将被注入渲染器,并使用super()应调用的方法将其传递给父类。父级的构造函数。

至少您可以像提出的解决方案一样创建@Injectable对象,但是将其命名为SomethingRenderer而不是Service,并将其与其他实际数据服务分开。

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有