Làm thế nào để thêm một thành phần vào một phần tử?


8

Tôi muốn thêm một thành phần vào phần tử ref khi còn nhỏ và có quyền truy cập vào các thuộc tính của nó.

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

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

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

Tôi đã thêm Lịch đầy đủ vào dự án của mình và đối với dòng thời gian tôi cần thêm các yếu tố tài nguyên tùy chỉnh. Đối với điều này, tôi chỉ có quyền truy cập vào HTMLEuity và một số dữ liệu. Vì vậy, những gì tôi muốn làm là chuyển một thành phần intialised cho HTMLEuity.

Ngay bây giờ tùy chọn duy nhất của tôi là viết html dưới dạng chuỗi và chuyển nó vào bên trongHTML. Có một lựa chọn tốt hơn?


bạn có thể giải thích thêm?
GaurangDhorda

Yêu cầu của bạn là gì? Những gì bạn muốn làm là không thể.
Angular

Bạn có thể đưa ra một giải pháp thay thế là có thể
Sachith Rukshan


Đã thử nhưng không hoạt động @Caro
Sachith Rukshan

Câu trả lời:


7

Trong một trong những dự án của tôi, tôi đã đạt được một cái gì đó tương tự như yêu cầu của bạn theo cách này. Hãy cho tôi biết nếu nó giúp?

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

Bằng cách này, bạn sẽ có tham chiếu đến thành phần động của bạn như componentRef


Cảm ơn câu trả lời. Tôi có thể truy cập thể hiện bằng cách sử dụng thành phầnRef. Đúng?
Sachith Rukshan

1
@SachithRukshan có
prabhatojha

4

Bạn có thể sử dụng Renderer2

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

Thêm ví dụ


Cảm ơn câu trả lời nhưng tôi đã kiểm tra giải pháp này trước đây. Và nó không làm cho nó dễ dàng hơn. Và y tốt hơn HTMLEuity
Sachith Rukshan

1
Nó là tốt hơn bởi vì bây giờ góc cạnh nhận thức được sự thay đổi DOM. Bởi chỉ cần thêm nó vào DOM góc là không biết về nó.
Robin Dijkhof

Lợi thế chính xác của nó là gì
Sachith Rukshan

4
Tôi thực sự chỉ giải thích
Robin Dijkhof

Tôi cũng đã triển khai các yếu tố bên trong của elemenrref và thêm logic kinh doanh nữa. Điều tôi cần biết là liệu thêm renderer2 có giúp mọi việc dễ dàng hơn không
Sachith Rukshan

1

Tài liệu Angular nói

Các thành phần góc là các thành phần góc được đóng gói dưới dạng các thành phần tùy chỉnh (còn được gọi là Thành phần Web)

Vì vậy, bạn có thể tạo phần tử bạn muốn thêm bằng cách sử dụng

  1. document.createElement('elementName')nếu nó là một yếu tố tùy chỉnh tự trị , hoặc
  2. document.createElement('baseElementName', {is: 'elementName'})nếu nó là một phần tử tích hợp tùy chỉnh .

Bạn có thể chèn phần tử bạn đã tạo vào một containerphần tử bằng cách container.insertAdjacentElement(position, element)giải thích ở đây .


Đó chính xác là những gì tôi đã làm nhưng những gì tôi muốn biết là một giải pháp tốt hơn. Vui lòng đọc đúng câu hỏi
Sachith Rukshan

1
@SachithRukshan Tôi tin rằng điều này khá khác vớiwriting 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;
  }

}

Tôi tìm thấy điều này khi tôi làm một số dogging. Hy vọng bạn thấy nó hữu ích
Amrish khan Sheik

Xin chào Amrish, Cảm ơn bạn đã cố gắng giúp đỡ. Có thể giải thích một chút về cách nó có thể giúp đỡ vấn đề của tôi.
Sachith Rukshan

@AmrishkhanSheik Xin chào, chào mừng bạn đến với Stackoverflow. Khi bạn đăng câu trả lời, bạn cũng nên đưa ra lời giải thích. Chỉ là một hàng rào mã không giải thích tại sao hoặc làm thế nào điều này phù hợp với câu trả lời. Xem: Làm thế nào để tôi viết một câu trả lời tốt?
Dane Brouwer

0

cho rằng thành phần được đăng ký trong window.customElements
và theo tài liệu Angular có lẽ,
bạn có thể làm:

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

Những gì bạn đang cố gắng để đạt được là không thể và chống lại các thực tiễn tốt nhất. Thay vào đó bạn phải hiển thị thành phần đó với các điều kiện. Bạn có thể tạo biến trong dịch vụ và dựa trên giá trị đó, thành phần có thể được hiển thị hoặc lặp.


Nếu tôi có thể làm như vậy thì tôi rất thích, nhưng plugin được sử dụng chỉ cung cấp HTMLEuity
Sachith Rukshan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.