当前位置:首页 > 技术分享 > 前端开发 > 正文内容

Angular国际化,懒加载,动态添加Base

admin1年前 (2023-12-22)前端开发3044

Angular做了国际化之后会生成不同语言的目录,加上在js文件是上传到后台项目中,通过域名加载js,js文件路径比较深,但js的加载是默认从根目录开始。

所以懒加载模块的时候总是报404错。经过查阅资料发现可以在模块加载前动态添加一个<base> tag,模块加载完成后再移除。


import {ElementRef, Injectable, Renderer2, RendererFactory2} from '@angular/core';
import {filter} from 'rxjs';
import {NavigationEnd, NavigationStart, Router} from '@angular/router';

@Injectable({
  providedIn: 'root',
})
export class AppInitializationService {
  baseElement: HTMLBaseElement;
  private targetSubstring = '/scm/smi/dist'

  private renderer: Renderer2;

  constructor(private rendererFactory: RendererFactory2) {
    this.renderer = this.rendererFactory.createRenderer(null, null);
  }

  setBaseUrl (router: Router, elm: ElementRef) {
    router.events.pipe(filter(event => event instanceof NavigationStart || event instanceof NavigationEnd))
      .subscribe(async (routerEvent: any) => {
        if (await routerEvent instanceof NavigationStart) {
        
          // set base tag
          this.targetSubstring =  elm.nativeElement.getAttribute('baseUrl');
          this.setBaseHref(this.targetSubstring)
        }
        // remove <base /> after module loaded
        if (await routerEvent instanceof NavigationEnd) {
          this.removeBaseHref()
        }
      });
  }

  setBaseHref(newUrl: string): void {
    const baseElement = this.renderer.createElement('base');
    this.renderer.setAttribute(baseElement, 'href', newUrl);
    const headElement = document.querySelector('head');
    if (headElement) {
      this.renderer.appendChild(headElement, baseElement);
    }
  }

  removeBaseHref() {
    const baseElements = document.querySelectorAll('base');
    for (const baseElement of Array.from(baseElements)) {
      if (baseElement.href.indexOf(this.targetSubstring) > 0) {
        this.baseElement = baseElement
      }
    }
    if (this.baseElement) {
      this.baseElement.remove();
    }
  }
}


版权声明:本文由沐萱草的笔记发布,如需转载请注明出处。

本文链接:https://mxcst.com/?id=14

返回列表

上一篇:modules[moduleId] is undefined error

没有最新的文章了...

“Angular国际化,懒加载,动态添加Base” 的相关文章

nodejs更改全局依赖安装路径

nodejs更改全局依赖安装路径

更改全局安装路径: npm config set prefix "你设置的文件夹路径" 更改缓存路径: npm config set cache "你设置的文件夹路径"...

Ant design Vue 实现动态表单及验证

Ant design Vue 实现动态表单及验证

<template> <a-form-model       ref="dynamicValidateForm"       :mode...

modules[moduleId] is undefined error

modules[moduleId] is undefined error

modules[moduleId] is undefined error应该是webpack的一个bug, 具体修复可以修改配置,使用:optimization: { concatenateModules: false, providedExports:&nb...