2017-11-30 5 views
0

동적 레이아웃과 함께 작동하는 각도 1.x 앱이 있습니다. 앱은 화면의 메타 데이터가있는 레이아웃 json을 받고 간단히 컴파일 된 구성 요소를 생성하고 화면을 만듭니다.각도 5로 동적으로 기존 구성 요소 컴파일 및 렌더링

관련 "중요한 코드는"다음과 같습니다

const element = this.$compile(`<${this.control.type} control="control" data="data"></${this.control.type}>`)(scope); 
this.$element.replaceWith(element); 

을 지금, 나는 5 각도에이를 마이그레이션하기 위해 노력하고있어 나는 5 각도는 DOM 조작을 떨어 있음을 이해 한하고 $이 기능을 컴파일 .

저는 동적 HTML (예 : {{1 + 1}})과 다른 비추천 물체 (각도 5 이전)를 렌더링하는 방법을 알고 있지만 렌더링에 적합하지 않은 솔루션을 찾았습니다 동적으로 만들어진 구성 요소 (및 내부 바인딩 처리).

나는이 AngularJS와 같은 자기에 의해 구성 요소를 만들 수있는 방법입니다 기능

+0

,이 기사를 읽고 [다음은 각도의 동적 구성 요소에 대해 알아야 할 것입니다 ] (https://blog.angularindepth.com/here-is-what-you-need-to-know-about-dynamic-components-in-angular-ac1e96167f9e) 및 [이 답변] (https : // stackoverflow. com/a/47472523/2545680). –

+0

을 통해 무엇을해야하는지에 대한 아이디어를 얻을 수 있지만 그 길로가는 것이 좋습니다. AngluarJS에서 동일한 전략을 사용했지만 Angular로 마이그레이션 한 후에는 서비스의 구성 요소에 대한 모든 참조를 유지하기 시작했으며 필요한 경우 수동으로 삽입했습니다. 내가 링크 된 기사에서는 구성 요소를 수동으로 조작하는 방법을 보여줍니다. –

+0

@ AngularInDepth.com - 뭔가 다른 것을 찾고있었습니다 (즉석에서 바인딩이있는 기존 구성 요소를 컴파일하는 경우). 내 주요 문제는 구성 요소의 문자열 이름을 유형으로 변환하는 것이 었습니다. 이 링크의 사용 사례는 다음과 같습니다. http://blog.angular.cool/2016/11/dynamic-components-with.html 현재이 경로는 제가 취한 경로입니다. 여분의 문자열 유형 매핑 개체를 만들고 주입 가능한 바인딩을 사용하여 동적 구성 요소를 즉시 만들었습니다. –

답변

1

이런 종류의 작업을 수행 할 수있는 방법이 있습니까 : (그것을 파괴하는 것을 잊지 마세요에 componentRef에) (파괴 불러!)이 작업을 수행

부모 요소 :

@ViewChild('componentHolder', { read: ViewContainerRef }) componentHolder: ViewContainerRef; 

constructor(private componentFactoryResolver: ComponentFactoryResolver) { } 
public createComponent(): void { 
      const componentFactory = this.componentFactoryResolver.resolveComponentFactory(MyComponent); 
      const componentRef = this.componentHolder.createComponent(componentFactory); 
} 

부모 구성 요소 HTML :

<button (click)="createComponent()">Add New MyComponent below</button> 
<div #componentHolder ></div> 

NgModule의를 MyComponent 추가 : 당신이 달성하려고하는 것은 여전히 ​​각도에서 가능하다

... 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    RouterModule.forRoot(appRoutes), 
    ], 
    entryComponents: [ 
    MyComponent 
    ],... 
+0

'this.componentFactoryResolver.resolveComponentFactory (MyComponent);'-이 라인은 저에게 문제입니다. 내 예제에서 볼 수 있듯이 컨트롤 유형을 문자열로 해결하려고합니다. 답장을 보내 주셔서 감사합니다. –

+0

Type Object를 resolveComponentFactory에 전달해야합니다. 수행 할 수있는 작업은 문자열을 ''유형 (예 : 'MyComponent'=> MyComponent)으로 분해하는 Factory/Map을 만드는 것입니다. 그렇지 않으면 다른 옵션이 없습니다. routerConfig의 각도 라우터를 살펴보고 Type 클래스를 제공해야합니다. –

+0

이것은 현재 해결 방법이며 (해당 구성 요소를 entryComponents로 추가하는 것입니다). 나는 여전히 @Input()을 동적 구성 요소에 주입하는 것과 관련하여 하나의 문제가있다. 어떻게 달성 할 수 있는지 알고 있는가? –