elementrefにコンポーネントを追加する方法は?


8

elementrefにコンポーネントを子として追加し、そのプロパティにアクセスしたい。

const element: HTMLElement = document.createElement('div');

element.innerHTML = // Component needs to be added here

// Need to have access to properties of the Component here

プロジェクトにフルカレンダーを追加しました。タイムラインでは、カスタムリソース要素を追加する必要があります。このため、HTMLElementと一部のデータにのみアクセスできます。だから私がしたいのは、初期化されたコンポーネントをHTMLElementに渡すことです。

現在、私の唯一のオプションは、HTMLを文字列として書き込み、それをinnerHTMLに渡すことです。より良いオプションはありますか?


もっと説明できますか?
GaurangDhorda

ur requirmentとは何ですか?あなたがしたいことは不可能です。
Angular

あなたは代替案を与えることができます
11:02のSachith Rukshan


試してみたが機能しなかった@Caro
Sachith Rukshan

回答:


7

私のプロジェクトの1つで、私はこの方法であなたの要求に似た何かを達成しました。それが役立つかどうか教えてください?

constructor(private componentFactoryResolver: ComponentFactoryResolver,
            private injector: Injector, 
            private appRef: ApplicationRef) {

  const componentFactory = this.componentFactoryResolver.resolveComponentFactory(DynamicComponent); // Your dynamic component will replace DynamicComponent

  const componentRef = componentFactory.create(this.injector);

  this.appRef.attachView(componentRef.hostView);  

  const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;

  const element: HTMLElement = document.createElement('div');
  element.appendChild(domElem); // Component needs to be added here
  document.body.appendChild(element);
}

このようにして、動的コンポーネントへの参照が componentRef


答えてくれてありがとう。componentRefを使用してインスタンスにアクセスできます。正しい?
Sachith Rukshan

1
@SachithRukshanはい
prabhatojha

4

レンダラ2を使用できる可能性があります

export class AppComponent { 
@ViewChild('addButton') 
  private animateThis: ElementRef;  
  constructor(private renderer: Renderer2) {}

  addBtn() {
    const button = this.renderer.createElement('button'); 
    const buttonText = this.renderer.createText('This is a button');
    this.renderer.appendChild(button, buttonText);
    this.renderer.appendChild(this.animateThis.nativeElement, button);
  }
}

その他の例


答えてくれてありがとう。でも、以前にこの解決策をチェックしたことがある。そしてそれはそれを少しも簡単にしません。そして、それはHTMLElementよりも優れています
Sachith Rukshan

1
AngularはDOMの変更を認識しているので、より良い方法です。DOMに追加するだけで、angularはそれを認識しません。
Robin Dijkhof

それの正確な利点は何ですか。
Sachith Rukshan

4
私は文字通り説明しました
Robin Dijkhof

私はすでにelemenrrefの内部要素を実装し、ビジネスロジックも追加しています。したがって、renderer2を追加することでそれが簡単になるかどうかを知る必要があります
Sachith Rukshan

1

Angularのドキュメントは言う

Angular要素は、カスタム要素としてパッケージ化されたAngularコンポーネントです(Webコンポーネントとも呼ばれます)。

したがって、次のコマンドを使用して、追加する要素を作成できます。

  1. document.createElement('elementName')それがあれば自律カスタム要素、または
  2. document.createElement('baseElementName', {is: 'elementName'})それがされている場合、内蔵要素にカスタマイズ

ここで説明するように、作成したcontainer要素を要素に挿入できますcontainer.insertAdjacentElement(position, element)


それはまさに私がやったことですが、私が知りたいのはより良い解決策です。質問を正しくお読みください
Sachith Rukshan

1
@SachithRukshanこれはかなり違うと思いますwriting the html as the string and passing it to the innerHTML
Dane Brouwer

0
import { AfterContentInit, Component, ElementRef } from '@angular/core';

@Component({
    selector: 'app-root',
    template: `
    <h1>My App</h1>
    <pre>
      <code>{{ node }}</code>
    </pre>
  `
})
export class AppComponent implements AfterContentInit {
  node: string;

  constructor(private elementRef: ElementRef) { }

  ngAfterContentInit() {
    const tmp = document.createElement('div');
    const el = this.elementRef.nativeElement.cloneNode(true);

    tmp.appendChild(el);
    this.node = tmp.innerHTML;
  }

}

私はいくつかのドッギングをしたときに私はこれを見つけました。お役に立てば幸い
Amrish khan Sheik

こんにちはアムリッシュ、手伝ってくれてありがとう それが私の問題にどのように役立つかについて少し説明できます。
Sachith Rukshan

@AmrishkhanSheikこんにちは、Stackoverflowへようこそ。回答を投稿するときは、説明も提供することをお勧めします。コードフェンスだけでは、なぜこれが答えに関係するのか、またはどのように関係するのかは説明されていません。参照:良い答えを書くにはどうすればよいですか?
Dane Brouwer、

0

コンポーネントがwindow.customElementsに登録されていることを考える
と、Angularのドキュメントによると、おそらく
そうです。

var element = document.createElement("div");

var comp= document.createElement("your-component")
/*
optionally set component attributes or anything else
you also have access to the component's properties here
comp.setAttribute("name",value)
console.log(comp.exampleProperty)
*/
element.appendChild(comp)


-1

あなたが達成しようとしていることは不可能であり、ベストプラクティスに反しています。代わりに、そのコンポーネントを条件付きで示す必要があります。稼働中に変数を作成し、その値に基づいてコンポーネントを表示またはループすることができます。


私がやりたいようにそれを行うことが可能であったが、使用されているプラ​​グインはHTMLElementのみを提供している場合
Sachith Rukshan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.