Ответ 1
В соответствии с вашими ввозами
import { Injectable, Renderer2 } from '@angular/core'
Я подозреваю, что вы пытаетесь ввести Renderer2
в свой класс обслуживания. Это не сработает. Вы не можете вводить Renderer2
в сервисе. Он должен работать на компоненты и службы, которые предоставляются внутри компонента.
Мы можем взглянуть на исходный код https://github.com/angular/angular/blob/4.0.1/packages/core/src/view/provider.ts#L363-L373
while (view) {
if (elDef) {
switch (tokenKey) {
case RendererV1TokenKey: {
const compView = findCompView(view, elDef, allowPrivateServices);
return createRendererV1(compView);
}
case Renderer2TokenKey: {
const compView = findCompView(view, elDef, allowPrivateServices);
return compView.renderer;
}
он проверяет только внутри дерева инжектора элементов. И нет других мест, где этот токен может быть предоставлен
Итак, вы должны передать Renderer2
из компонента в службу, когда вы вызываете какой-либо метод обслуживания https://github.com/angular/angular/issues/17824#issuecomment-311986129
или вы можете предоставить услугу в компоненте
@Injectable()
export class Service {
constructor(private r: Renderer2) {}
}
@Component({
selector: 'my-app',
templateUrl: `./app.component.html`,
providers: [Service]
})
export class AppComponent {
constructor(private service: Service) {}
}