Dynamically load a component inside a Material MatDialog

前端 未结 2 413
挽巷
挽巷 2020-12-04 18:38

Can anyone provide an example of how to dynamically load a component into a Material MatDialog?

What I would like to do is this: I will provide the MatDialog confi

相关标签:
2条回答
  • 2020-12-04 18:43

    There are different options:

    1) Built-in structural directive ngComponentOutlet

    <ng-container *ngComponentOutlet="data.component"></ng-container> 
    

    Example

    2) Using angular material cdk. More precisely you can use PortalModule from secondary entry point @angular/cdk/portal

    dialog.component.ts

    import { ComponentPortal } from '@angular/cdk/portal';
    
    @Component({...})
    export class DialogDialog {
    
      portal: ComponentPortal<any>;
    
      constructor(...
        @Inject(MAT_DIALOG_DATA) public data: any) { }
    
      ngOnInit() {
        this.portal = new ComponentPortal(this.data.component);
      }
          
    

    dialog.component.html

    <ng-template [cdkPortalOutlet]="portal"></ng-template>
    

    Example

    3) Using Angular low-level API

    dialog.component.ts

    @Component({...})
    export class DialogDialog {
    
      @ViewChild('target', { read: ViewContainerRef }) vcRef: ViewContainerRef;
    
      componentRef: ComponentRef<any>;
    
      constructor(
        ...
        private resolver: ComponentFactoryResolver,
        @Inject(MAT_DIALOG_DATA) public data: any) { }
    
      ngOnInit() {
        const factory = this.resolver.resolveComponentFactory(this.data.component);
        this.componentRef = this.vcRef.createComponent(factory);
      }
    
    
      ngOnDestroy() {
        if (this.componentRef) {
          this.componentRef.destroy();
        }
      }  
    }
    

    dialog.component.html

    <ng-template #target></ng-template>
    

    Example

    0 讨论(0)
  • 2020-12-04 18:58

    The actual modal component .ts: (note that the modal component's html is where you will write your code above)

    import {Component, Inject, OnInit} from '@angular/core';
    import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';
    
    
    @Component({
        selector: 'app-modal',
        templateUrl: './modal.component.html',
        styleUrls: ['./modal.component.css']
    })
    export class ModalComponent implements OnInit {
    
        constructor(public dialogRef: MatDialogRef<CreateFirmComponent>,
                    @Inject(MAT_DIALOG_DATA) public data: any)
                     {
        }
    
        ngOnInit() {
        }
    
        onConfirm() {
            this.dialogRef.close(true);
        }
    
        onCancel(): void {
            this.dialogRef.close(false);
        }
    
    }
    

    And the component from where you call the Modal:

    import {Component, OnInit} from '@angular/core';
    import {MatDialog} from '@angular/material';
    import {ModalComponent} from './modal-component';
    
    
    @Component({
        selector: 'app-list',
        templateUrl: './list.component.html',
        styleUrls: ['./list.component.css']
    })
    export class ListComponent implements OnInit {
    
    
        constructor(public dialog: MatDialog) {
        }
    
    
    
    
        openDialog(): void {
            let dialogRef = this.dialog.open(ModalComponent, {
                width: '500px'
            });
    
            dialogRef.afterClosed().subscribe(result => {
                // result is what you get after you close the Modal
            });
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题