美文网首页
Angular 动态组件加载

Angular 动态组件加载

作者: Messix_1102 | 来源:发表于2022-12-13 09:10 被阅读0次

1.首先定义一个辅助指令

辅助指令用来标记 动态组件 的插入点

// ad.directive.ts

import { Directive, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[adHost]',
})
export class AdDirective {
  constructor(public viewContainerRef: ViewContainerRef) { }
}

2.定义需要动态插入的组件

// ad.component.ts 组件统一接口
export interface AdComponent {
    data: any;
}

// hero-job-ad.component.ts 动态组件
import { Component, Input } from '@angular/core';
import { AdComponent } from './ad.component';

@Component({
  template: `
    <div class="job-ad">
      <h4>{{data.headline}}</h4>
      {{data.body}}
    </div>
  `
})
export class HeroJobAdComponent implements AdComponent {
  @Input() data: any;
}

// hero-profile.component.ts 动态组件
import { Component, Input } from '@angular/core';
import { AdComponent } from './ad.component';

@Component({
  template: `
    <div class="hero-profile">
      <h3>Featured Hero Profile</h3>
      <h4>{{data.name}}</h4>

      <p>{{data.bio}}</p>

      <strong>Hire this hero today!</strong>
    </div>
  `
})
export class HeroProfileComponent implements AdComponent {
  @Input() data: any;
}

3.定义Service获取所有的动态组件

// ad.service.ts
import { Injectable } from '@angular/core';
import { HeroJobAdComponent } from './hero-job-ad.component';
import { HeroProfileComponent } from './hero-profile.component';
import { AdItem } from './ad-item';

@Injectable()
export class AdService {
  getAds() {
    return [
      new AdItem(
        HeroProfileComponent,
        { name: 'Bombasto', bio: 'Brave as they come' }
      ),
      new AdItem(
        HeroProfileComponent,
        { name: 'Dr IQ', bio: 'Smart as they come' }
      ),
      new AdItem(
        HeroJobAdComponent,
        { headline: 'Hiring for several positions', body: 'Submit your resume today!' }
      ),
      new AdItem(
        HeroJobAdComponent,
        { headline: 'Openings in all departments', body: 'Apply today' }
      )
    ];
  }
}

// ad-item.ts 动态组件传参对象
import { Type } from '@angular/core';

export class AdItem {
  constructor(public component: Type<any>, public data: any) {}
}

4.定义容器,动态展示

//ad-banner.component.ts

import { Component, ViewContainerRef, ComponentFactoryResolver, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';

import { AdItem } from './ad-item';
import { AdService } from './ad.service';
import { AdDirective } from './ad.directive';
import { AdComponent } from './ad.component';

@Component({
  selector: 'app-ad-banner',
  template: `
    <div class="ad-banner-example">
      <h3>Advertisements</h3>
      <ng-template [adHost]="adItem"></ng-template>
    </div>
  `
})
export class AdBannerComponent implements OnInit, OnDestroy {
  ads: AdItem[];

  currentAdIndex = -1;

  @ViewChild(AdDirective, {static: true}) adHost!: AdDirective;
  interval: any = 0;

  constructor(private componentFactoryResolver: ComponentFactoryResolver,
    private adService: AdService){
    this.ads = this.adService.getAds();
  }
  
  ngOnInit(): void {
    this.loadComponent();
    this.getAds();
  }

  ngOnDestroy() {
    clearInterval(this.interval);
  }

  loadComponent() {
    this.currentAdIndex = (this.currentAdIndex + 1) % this.ads.length;
    const adItem = this.ads[this.currentAdIndex];

    const viewContainerRef = this.adHost.viewContainerRef;
    viewContainerRef.clear();

    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(adItem.component);
    const componentRef = viewContainerRef.createComponent<AdComponent>(componentFactory);
    componentRef.instance.data = adItem.data;
  }

  getAds() {
    this.interval = setInterval(() => {
      this.loadComponent();
    }, 3000);
  }
}

相关文章

  • Angular 动态加载组件

    场景:应用在运行期间加载一些新的组件。用法:锚点指令: 需要用锚点指令告诉angular 在哪里插入新组件。首先建...

  • Angular动态加载组件

    引言 有时候需要根据URL来渲染不同组件,我所指的是在同一个URL地址中根据参数的变化显示不同的组件;这是利用An...

  • Angular 动态组件加载

    1.首先定义一个辅助指令 辅助指令用来标记 动态组件 的插入点 2.定义需要动态插入的组件 3.定义Service...

  • Angular动态组件&响应式表单的实现[附源码]

    本文将通过一个简单的例子简单展示Angular动态组件+响应式表单的使用。【关键字】: Angular,动态组件,...

  • Angular中的动态组件加载

    看了Angular官网Hero教程中的动态组件一节,然后还看了一篇讲的不错的文章,结合自己的理解,总结Angula...

  • 深入Angular:组件(Component)动态加载

    Felt like the weight of the world was on my shoulders…Pre...

  • Angular4 动态加载组件杂谈

    最近接手了一个项目,客户提出了一个高大上的需求:要求只有一个主界面,所有组件通过Tab来显示。其实这个需求并不诡异...

  • 2018-08-30

    Angular4加载顺序 今天遇到了一个比较关于angular4加载组件顺序的坑,当我在app.component...

  • 挂载元素

    $mount el 以上挂载写法不会被组件当做子组件进行加载 3.动态组件,参考官方文档 动态组件

  • Angular 4 动态创建组件

    这篇文章我们将介绍在 Angular 中如何动态创建组件。 定义 AlertComponent 组件 首先,我们需...

网友评论

      本文标题:Angular 动态组件加载

      本文链接:https://www.haomeiwen.com/subject/cxdcqdtx.html