2017-12-24 4 views
0

にHTMLを作成しました:コンパイルが動的に私はDOMに次のHTMLを挿入するサードパーティのライブラリが存在している成分を、持っている既存のコンポーネント

<input (click)="doSomething()"/>{{someText}}

doSomethingは私のコンポーネントで関数であり、 {{someText}}はプロパティです。

私はこの文字列を既存のコンポーネントにコンパイルし、ComponentFactoryResolverで新しい文字列を作成しない方法を見つけようとしています。

私は動的HTMLを追加してからChangeDetectorRef.detectChanges()、またはNgZone.run(callback)またはApplicationRef.tick()を使用しようとしました。これらのどれもHTMLをコンパイルしませんでした。

アイデア?

+0

あなたが本当にあなたの戦略を変更する必要があります。 AOTコンパイラでは、プロダクション時には角度のあるアプリケーションがコンパイルされています(または少なくともコンパイルされている必要があります)。アプリケーションを使用して角コンパイラを提供しないようにします。したがって、実行時にコンパイルすることはもはや不可能です。もちろん、そうしないことに決めても構いませんが、フレームワークとそのベストプラクティスに反することになります。 –

答えて

0

ViewContainerRef.createEmbeddedViewを使用してはどう:

テンプレート:

<!-- location in your component template to add the dynamic template --> 
<ng-container #ref></ng-container> 

... 

<!-- dynamic template definition --> 
<ng-template #tpl> 
    <input (click)="doSomething()"/>{{someText}} 
</ng-template> 

コンポーネントクラス:

someText: string; 

@ViewChild('ref') 
vcr: ViewContainerRef; 

@ViewChild('tpl') 
tpl: TemplateRef; 

ngOnInit() { 

    myLib.onSomeEvent(() => { 
    this.vcr.createEmbeddedView(this.tpl); 
    }) 
} 

doSomething() { 
    ... 
} 
関連する問題