• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 浅谈angular9中组件动态加载的实现方法

浅谈angular9中组件动态加载的实现方法

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了angular9,组件动态加载等相关知识,希望对您有所帮助

按条件加载组件,实现组件的灵活切换,减少大量ngIf的使用,在angular中也是比较常见的操作。本篇文章就来大家一起交流一下angular组件的动态使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。


浅谈angular9中组件动态加载的实现方法

指令的创建

在添加组件之前,先要定义一个锚点来告诉 Angular 要把组件插入到什么地方。

在src/dynamic-banner/ad.directive.ts下

import { Directive, ViewContainerRef } from '@angular/core'; @Directive({    selector: '[ad-host]',})export class AdDirective {    constructor(public viewContainerRef: ViewContainerRef) { }}

AdDirective 注入了 ViewContainerRef 来获取对容器视图的访问权,这个容器就是那些动态加入的组件的宿主。

在 @Directive 装饰器中,要注意选择器的名称:ad-host,它就是你将应用到元素上的指令。


动态组件的核心代码

动态组件加载的html

src/dynamic-banner/ad-banner.component.html

<div class="ad-banner-example">    <h3>Advertisements</h3>    <ng-template ad-host></ng-template></div>

动态组件的ts

src/dynamic-banner/ad-banner.component.ts

import { Component, Input, OnInit, ViewChild, ComponentFactoryResolver, OnDestroy, SimpleChanges } from '@angular/core'; import { AdDirective } from './ad.directive';import { AdItem }      from './ad-item';import { AdComponent } from './ad.component';import { componentMap } from './component/utils';@Component({    selector: 'app-ad-banner',    templateUrl: './ad-banner.component.html',    // styleUrls: ['./ad-banner.component.css']})export class AdBannerComponent implements OnInit {    @Input() type: string = 'ad1' // 传入的key,确定加载那个组件    @Input() data: any = {} // 传入组件的数据    @ViewChild(AdDirective, {static: true}) adHost: AdDirective; // 动态组件的指令    constructor(private componentFactoryResolver: ComponentFactoryResolver) { }     ngOnInit() {        this.loadComponent();    }    ngOnChanges(changes: SimpleChanges): void {        if (changes['type']) this.loadComponent()    }     loadComponent() {        // adItem 要加载的组件类,以及绑定到该组件上的任意数据        const adItem = new AdItem(componentMap[this.type], this.data)         const componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);        const viewContainerRef = this.adHost.viewContainerRef;        viewContainerRef.clear();        const componentRef = viewContainerRef.createComponent(componentFactory);        (<AdComponent>componentRef.instance).data = adItem.data;    }}

ad-item.ts

src/dynamic-banner/ad-item.ts

import { Type } from '@angular/core'; export class AdItem {    constructor(public component: Type<any>, public data: any) {}}

ad.component.ts

src/dynamic-banner/ad.component.ts

import { Type } from '@angular/core';export interface AdComponent {    data: any;}

组件统一注册

src/dynamic-banner/share.module.ts

import { NgModule } from '@angular/core';import { CommonModule } from '@angular/common';import { componets } from './component/utils';import { AdDirective } from './ad.directive';import { AdBannerComponent } from './ad-banner.component'; @NgModule({    imports: [        CommonModule    ],    exports:[        [...componets],        AdDirective,        AdBannerComponent,    ],    declarations: [        [...componets],        AdDirective,        AdBannerComponent,    ],    entryComponents: [        [...componets]    ]})export class ShareModule { }

组件的映射

src/dynamic-banner/component/utils.ts

import { HeroProfileComponent } from "./hero-profile.component";import { HeroJobAdComponent } from './hero-job-ad.component';const componentMap = {    ad1: HeroProfileComponent,    ad2: HeroJobAdComponent}const componets = [    HeroProfileComponent,    HeroJobAdComponent]export {componets, componentMap}

效果图

浅谈angular9中组件动态加载的实现方法

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈angular9中组件动态加载的实现方法

相关文章

  • 深入了解Node.js 中的多线程和多进程
  • Thinkphp+layer+ajax如何完成增加方法(附代码示例)
  • MySQL大数据分页查询性能优化
  • Thinkphp5.1 + layui时间范围设置方法
  • Photoshop制作彩色效果艺术字教程
  • MySQL8.0版本和PHP7不兼容问题?
  • 两分钟带你了解在CSS中三种使图片居中的方法
  • Laravel学习记录之强制指定索引进行查询
  • 4种移动端适配方法
  • ThinkPHP5跟laravel的区别有哪些

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 织梦系统“模块管理”里面的“模块列表”显示
    • PHP怎么将整数转为浮点数类型
    • 帝国CMS实现tagid伪静态tag的方法
    • PhotoShop打造五彩抽象透明的圆球形图标制作教程
    • 怎么修改和重置WAMP的phpMyAdmin密码
    • 详解JS,Jquery获取屏幕的宽度和高度代码
    • 什么是依赖注入?在Angular中怎么实现?
    • 带你搞懂uniapp跨域问题(实例详解)
    • 解析thinkPHP基于反射实现钩子的方法
    • 突破dedecms软件下载地址数30个的限制

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有