Angular2プロジェクトでDOMを直接操作するのではなく、レンダラーを使用する方が良い理由を理解しています。ただし、アンインストール、キャッシュのクリア、Node、TypeScript、Angular-CLIの再インストールを数回繰り返しましたが、レンダラーを挿入しようとするとエラーが発生します。
import { Injectable, Renderer2 } from '@angular/core';
constructor(private renderer: Renderer2) {}
__zone_symbol__message: "Renderer2のプロバイダーがありません!"
__zone_symbol__stack: "Error↵at Error.ZoneAwareError
誰かが私が間違っていることを知っていますか?
更新:
@Injectable()
class MyService {
private renderer: Renderer2;
constructor(rendererFactory: RendererFactory2) {
this.renderer = rendererFactory.createRenderer(null, null);
}
}
詳細はこちらをご覧ください: https://github.com/angular/angular/issues/17824#issuecomment-351961146
以前のバージョン:
あなたの輸入によると
import { Injectable, Renderer2 } from '@angular/core'
サービスクラスにRenderer2
を挿入しようとしていると思われます。動作しません。サービスにRenderer2
を挿入することはできません。コンポーネント内で提供されるコンポーネントおよびサービスに対して機能するはずです。
ソースコードを見ることができます https://github.com/angular/angular/blob/4.0.1/packages/core/src/view/provider.ts#L363-L37
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) {}
}
_Renderer2
_を挿入することはできませんが、@Injectable()
サービス内で_RendererFactory2
_インスタンスを取得するために_Renderer2
_を実行できます。たとえば、Webworkerで内部的に使用する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