How to load component dynamically using component name in angular2?

后端 未结 5 1957
鱼传尺愫
鱼传尺愫 2020-11-29 03:58

I am currently loading angular components dynamically in my application using following code.

export class WizardTabCo         


        
5条回答
  •  生来不讨喜
    2020-11-29 04:39

    I know this post is old, but a lot of things have changed in Angular and I didn't really like any of the solutions from an ease of use and safety. Here's my solution that I hope you like better. I'm not going to show the code to instantiate the class because those examples are above and the original Stack Overflow question already showed a solution and was really asking how to get the Class instance from the Selector.

    export const ComponentLookupRegistry: Map = new Map();
    
    export const ComponentLookup = (key: string): any => {
        return (cls) => {
            ComponentLookupRegistry.set(key, cls);
        };
    };
    

    Place the above Typescript Decorator and Map in your project. And you can use it like so:

    import {ComponentLookup, ComponentLookupRegistry} from './myapp.decorators';
    
    @ComponentLookup('MyCoolComponent')
    @Component({
                   selector:        'app-my-cool',
                   templateUrl:     './myCool.component.html',
                   changeDetection: ChangeDetectionStrategy.OnPush
               })
    export class MyCoolComponent {...}
    

    Next, and this is important, you need to add your component to entryComponents in your module. This allows the Typescript Decorator to get called during app startup.

    Now anywhere in your code where you want to use Dynamic Components (like several of the above examples) when you have a Class Reference, you just get it from your map.

    const classRef = ComponentLookupRegistry.get('MyCoolComponent');  
    // Returns a reference to the Class registered at "MyCoolComponent
    

    I really like this solution because your KEY that you register can be the component selector, or something else that's important to you or registered with your server. In our case, we needed a way for our server to tell us which component (by string), to load into a dashboard.

提交回复
热议问题