Web Front-end
JS Tutorial
Teach you step by step how to create dynamic content using Angular CDK PortalTeach you step by step how to create dynamic content using Angular CDK Portal

I have introduced the dynamic view insertion of the native API before, and the function can already meet most usage scenarios. However, there are some shortcomings. It has not yet solved the need to insert content outside the Angular application, and the instructions cannot have input and output interactions with dynamically inserted components.
Fortunately, Angular officially provides a set of component development kits Component Dev Kit (CDK) as a basic tool for the development of various Angular components. Among them, "Portal" is provided to assist in the creation of dynamic views. .
This "dynamic view" can be a component, TemplateRef or DOM element, corresponding to three Portal types (ComponentPortal, TemplatePortal, DomPortal). The abstract generic base class of the three of them is Portal<t></t>, which has three methods: attach (mount to the container), detach (remove from the container), isAttached (determine whether the view is mounted) ).
The container is also defined by an abstract class BasePortalOutlet, which is similar to the view and includes attach (mount the view to the container), detach (remove the view from the container), and dispose (destroy the container) , isAttached (whether there is a mounted view). Its main implementation is the DomPortalOutlet class. Used to mount three types of dynamic views.
Creating dynamic content
Let’s first look at the creation of three dynamic views.
ComponentPortal
Compared with the native API, it is very simple to create a dynamic component. You only need to pass the component class into ComponentPortal Just use the constructor.
this.componentPortal = new ComponentPortal(ExampleComponent);
You can pass in any custom component class to create a ComponentPortal object and then dynamically insert it into the view.
✨Note: It is recommended to use the Ivy compiler for versions after Angular 9. If it is an old version of the compiler, the component class passed in needs to be declared in the entryComponents of the Module, and this Module No lazy loading.
TemplatePortal
Compared with components, the construction of TemplatePortal has one more parameter (ViewContainerRef). You should be very familiar with it after reading the previous article. You need to rely on it to call createEmbeddedView() to create an embedded view. Here, through constructor injection, the ViewContainerRef instance of the current component is directly used.
<ng-template #testTemplate> <p>一些需要动态插入的内容.</p> </ng-template>
@ViewChild('testTemplate') templatePortalContent: TemplateRef<any>;
constructor(private _viewContainerRef: ViewContainerRef) { }
ngAfterViewInit() {
this.templatePortal = new TemplatePortal(
this.templatePortalContent,
this._viewContainerRef
);
}In addition to the constructor, TemplatePortal also has a command (CdkPortal) that can be easily created.
<ng-template cdkPortal> <p>一些需要动态插入的内容.</p> </ng-template> <!-- 或写作 --> <!-- 和上面写法是一致的效果 --> <p *cdkPortal> 一些需要动态插入的内容. </p>
Then you can get the instance of TemplatePortal through @ViewChild.
DomPortal
Just like the above example, get the Template instance by @ViewChild to create it, you can also get it similarly ElementRef to create dynamic DOM.
<div #domPortalContent><span>原生DOM内容</span></div>
@ViewChild('domPortalContent') domPortalContent: ElementRef<HTMLElement>;
ngAfterViewInit() {
this.domPortal = new DomPortal(this.domPortalContent);
}This DOM can be dynamically transferred to any location. It should be noted that after the transfer, the original data binding or bound instructions may no longer be updated.
Insert container
The previous three types of Portal all said that they can be rendered to any position, so how to render them specifically?
CdkPortOutlet
The easiest way is to pass the CdkPortOutlet command:
<div> <ng-template [cdkPortalOutlet]="anyPortal"></ng-template> </div>
Pass to anyPortal Any Portal instance among the above three values will be dynamically rendered to the current position.
Different from the native API instructions, it can automatically determine what type of Portal it is. In addition, it has an additional event: attached. Through this event, you can get the mounted component instance or TemplateRef. This also makes interacting with mounted components very convenient.
Constructing a container instance
But since it is said that it can be rendered to any location, it naturally also includes outside the Angular application. To render to the application In addition, we need to create a container instance through the constructor.
This container class is DomPortalOutlet, which is the implementation subclass of PortalOutlet. Its construction parameters are mainly: Element (the DOM node of the mounted view), ComponentFactoryResolver (same as the previous article, used to dynamically build components), appRef (the overall instance of the current Angular application), Injector (injector, used to pass dependencies ).
constructor(
private viewContainerRef: ViewContainerRef,
@Inject(DOCUMENT) private document: any,
private injector: Injector,
private componentFactoryResolver: ComponentFactoryResolver
) {
// 在<body>下创建外部宿主元素
const container = this.document.createElement('div');
container.classList.add('outside-portal-container');
this.outsideContainer = this.document.body.appendChild(container);
// 获取应用实例
this.appRef = this.injector.get(ApplicationRef);
// 创建外部容器
this.outsideOutlet = new DomPortalOutlet(
this.outsideContainer,
this.componentFactoryResolver,
this.appRef,
this.injector
);
}
// 在应用外部插入动态组件。
openComponentPortalOutSideAngularContext(): void {
const componentPortal = new ComponentPortal(AlertComponent);
const componentRef = this.outsideOutlet.attach(componentPortal);
componentRef.instance.closeAlert.subscribe(() => {
this.outsideOutlet.detach();
});
}
// 在应用外部插入动态模板。
openTemplatePortalInsideAngularContext(): void {
const templatePortal = new TemplatePortal(this.templatePortalContent, this.viewContainerRef);
this.outsideOutlet.attach(templatePortal);
}In addition to mounting the view into a DOM element outside the application, you also need to be able to interact with the view. Components can inject dependencies, and templates can pass in context objects.
const injectionToken = new InjectionToken<any>('Sharing data with outside component portal');
const customInjector = Injector.create({ providers: [{ provide: CustomInjectionToken, useValue: 'test value' }] });Slightly modify the code to create outsideContainer and pass in the customInjector as a parameter (instead of using the injector of the current component)
// 重点是第四个参数 new DomPortalOutlet(this.outsideContainer, this.componentFactoryResolver, this.appRef, customInjector);
Correspondingly, this component only needs to be injected according to this injectionToken Just rely on it:
constructor(@Inject(injectionToken) public customData: any) {}It is relatively simple to pass the context to the template. When creating the TemplatePortal object, just pass in the context object:
// 重点是第三个参数
new TemplatePortal(this.templatePortalContent, this.viewContainerRef, { customData:'test values' });Summary
Compared with the native API, CDK portal mainly implements:
The ability to dynamically insert views outside the application;
The ability to interact with view data inserted into the outside;
More convenient and flexible instructions.
With it, it becomes easier to create dynamic component containers, pop-up windows, floating menus, or even build a low-code design platform.
Project source code: https://github.com/locotor/angular-dynamic-view-example
Online example: https://coding-pages-bucket-1575455- 8137703-14801-541995-1303365836.cos-website.ap-beijing.myqcloud.com/
For more programming-related knowledge, please visit: Introduction to Programming! !
The above is the detailed content of Teach you step by step how to create dynamic content using Angular CDK Portal. For more information, please follow other related articles on the PHP Chinese website!
JavaScript and the Web: Core Functionality and Use CasesApr 18, 2025 am 12:19 AMThe main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.
Understanding the JavaScript Engine: Implementation DetailsApr 17, 2025 am 12:05 AMUnderstanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.
Python vs. JavaScript: The Learning Curve and Ease of UseApr 16, 2025 am 12:12 AMPython is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.
Python vs. JavaScript: Community, Libraries, and ResourcesApr 15, 2025 am 12:16 AMPython and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.
From C/C to JavaScript: How It All WorksApr 14, 2025 am 12:05 AMThe shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.
JavaScript Engines: Comparing ImplementationsApr 13, 2025 am 12:05 AMDifferent JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.
Beyond the Browser: JavaScript in the Real WorldApr 12, 2025 am 12:06 AMJavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.
Building a Multi-Tenant SaaS Application with Next.js (Backend Integration)Apr 11, 2025 am 08:23 AMI built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 English version
Recommended: Win version, supports code prompts!

Atom editor mac version download
The most popular open source editor

Dreamweaver Mac version
Visual web development tools






