Angular再次加载预加载的svg。
创始人
2024-10-30 19:30:21
0

要在Angular中重新加载预加载的SVG,你可以使用Angular的动态组件加载功能来实现。下面是一个示例解决方案的代码:

  1. 在你的组件中定义一个变量,用于存储SVG的URL:
svgUrl: string = 'assets/icons/my-icon.svg';
  1. 在模板中使用img标签来加载SVG:
My Icon
  1. 创建一个动态组件加载器服务SvgLoaderService,用于重新加载SVG:
import { Injectable, ComponentFactoryResolver, ViewContainerRef, ComponentRef, Type } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class SvgLoaderService {
  private componentRef: ComponentRef;

  constructor(private resolver: ComponentFactoryResolver) { }

  loadSvg(svgUrl: string, container: ViewContainerRef, componentType: Type): Promise {
    return new Promise((resolve, reject) => {
      const factory = this.resolver.resolveComponentFactory(componentType);
      container.clear();
      const componentRef = container.createComponent(factory);

      const img = new Image();
      img.onload = () => {
        componentRef.instance.svgUrl = svgUrl;
        componentRef.changeDetectorRef.detectChanges();
        this.componentRef = componentRef;
        resolve();
      };
      img.onerror = () => {
        reject();
      };
      img.src = svgUrl;
    });
  }

  reloadSvg(svgUrl: string): Promise {
    return new Promise((resolve, reject) => {
      if (this.componentRef) {
        const img = new Image();
        img.onload = () => {
          this.componentRef.instance.svgUrl = svgUrl;
          this.componentRef.changeDetectorRef.detectChanges();
          resolve();
        };
        img.onerror = () => {
          reject();
        };
        img.src = svgUrl;
      } else {
        reject();
      }
    });
  }
}
  1. 在你的组件中注入SvgLoaderService并使用它来加载和重新加载SVG:
import { Component, OnInit, ViewChild, ViewContainerRef } from '@angular/core';
import { SvgLoaderService } from './svg-loader.service';

@Component({
  selector: 'app-svg-component',
  template: `
    
  `,
})
export class SvgComponent implements OnInit {
  @ViewChild('svgContainer', { read: ViewContainerRef }) svgContainer: ViewContainerRef;

  constructor(private svgLoaderService: SvgLoaderService) { }

  ngOnInit() {
    this.loadSvg();
  }

  loadSvg() {
    this.svgLoaderService.loadSvg(this.svgUrl, this.svgContainer, MySvgComponent)
      .then(() => {
        console.log('SVG loaded successfully!');
      })
      .catch(() => {
        console.error('Failed to load SVG.');
      });
  }

  reloadSvg() {
    this.svgLoaderService.reloadSvg(this.svgUrl)
      .then(() => {
        console.log('SVG reloaded successfully!');
      })
      .catch(() => {
        console.error('Failed to reload SVG.');
      });
  }
}
  1. 创建一个用于显示SVG的动态组件MySvgComponent
import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-my-svg',
  template: `
    My Icon
  `,
})
export class MySvgComponent {
  @Input() svgUrl: string;
}

现在,你可以使用SvgComponent来加载和重新加载预加载的SVG。调用loadSvg()方法来加载SVG,调用reloadSvg()方法来重新加载SVG。

相关内容

热门资讯

透视科技!wpk透视辅助软件,... 透视科技!wpk透视辅助软件,aapoker透视插件,玩家必备攻略(有挂总结)1)wpk透视辅助辅助...
透视实锤!hhpoker辅助软... 透视实锤!hhpoker辅助软件,wepoker底牌透视脚本http,科普攻略(有挂总结)1、上手简...
透视智能ai!hhpoker透... 透视智能ai!hhpoker透视脚本安卓,hhpoker透视功能如何下载,科普常识(有挂方法)1、用...
透视总结!红龙poker脚本,... 透视总结!红龙poker脚本,wepoker透视脚本苹果版,总算了解(有挂详情)1、ai机器人多个强...
透视教程!hhpoker透视脚... 透视教程!hhpoker透视脚本视频,aapoker可以开挂吗,热点讨论(有挂规律);1、完成的残局...
透视总结!aapoker辅助器... 透视总结!aapoker辅助器是真的吗,aapoker辅助器怎么用,推荐一款(有挂介绍);进入游戏-...
透视黑科技!wpk辅助器安装,... 透视黑科技!wpk辅助器安装,hhpoker怎么开透视,避坑细节(有挂辅助挂);1、ai辅助优化,发...
透视中牌率!德普之星透视辅助软... 透视中牌率!德普之星透视辅助软件下载,智星菠萝可以辅助吗,查到实测(有挂攻略)1、系统规律教程、辅助...
透视透视!红龙poker透视,... 透视透视!红龙poker透视,wepoker透视脚本免费,终于清楚(有挂详情)1、操作简单,无需注册...
透视美元局!wepoker底牌... 透视美元局!wepoker底牌透视脚本下载,wepoker透视脚本,最新研发(有挂教程)1、很好的工...