如何将脚本标签嵌入 Angular 组件

How to embed a script tag into Angular component

我有一个 Angular/Typescript 网站。我需要嵌入第三方脚本。该脚本生成一个 table。

如何在 home.component.html 中显示 table。不是在开始或开始时,在里面。像这样。

我已经能够嵌入脚本,但它看起来不像脚本正在呈现,所以它只是在源代码中显示它,但不呈现 table。

更新

table 现在可以呈现,但只能在 app-root 之外呈现。它应该在 home.component.html 内。 Source Image

home.component.ts

import { Component, OnInit, AfterViewInit } from '@angular/core';
import { DOCUMENT } from '@angular/common'

declare var myExtObject: any;

@Component({
  selector: 'app-careers',
  templateUrl: './careers.component.html',
  styleUrls: ['./careers.component.scss']
})

export class CareersComponent implements OnInit {
  private iife: any

  ngOnInit() {
  }

  ngAfterViewInit() {
    this.iife = myExtObject()
  }

}

home.component.html

<div id="BambooHR">
    <script src="https://xxxxxxx.xxx.com" type="text/javascript"></script>
    <div></div>
</div>

脚本背后的代码如下。我在 external.js 文件中有它。

var myExtObject = function() {

 //add css file to dom so IE8 recognizes it
 document.write('<link href="https://xxx.css" rel="stylesheet" />');

 var divId="BambooHR-ATS";
 var el=document.getElementById(divId);
 if(!el) {
  document.write("<div id=\""+divId+"\"></div>");
 }

 var xmlhttp;
 var ieFlag = 0;
 if (('XDomainRequest' in window && window.XDomainRequest !== null) && document.documentMode < 10) {
  xmlhttp=new XDomainRequest();
  ieFlag = 1;
 } else if (window.XMLHttpRequest) {
  xmlhttp=new XMLHttpRequest();
 } else {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 }

 var embedUrl = "https://xxx.php";

 var departmentId = "0";

 if (departmentId) {
  embedUrl += '?departmentId=' + encodeURIComponent(departmentId);
 }

 document.addEventListener('readystatechange', function(event) {
  if (event.target.readyState === "complete") {
   if (ieFlag == 1) { //needed for IE9 CORS
    xmlhttp.onload = loadd;
    xmlhttp.open("GET",embedUrl);
    xmlhttp.send();

   } else {
    xmlhttp.onreadystatechange=function() {
     if(xmlhttp.readyState==4 && xmlhttp.status==200) {

      var content = xmlhttp.responseText;
      var footerId="BambooHR-Footer";
      var fel=document.getElementById(footerId);

      el=document.getElementById(divId);

      if(el && !fel) {
       content += "<div id="xxx"/></a></div>";
      }

      if(el) el.innerHTML=content;
     }
    }

    xmlhttp.open("GET",embedUrl,true);
    xmlhttp.send();
   }
  }
 });

 function loadd() { //needed for IE9 CORS
  var content = xmlhttp.responseText;
  var footerId="BambooHR-Footer";
  var fel=document.getElementById(footerId);

  el=document.getElementById(divId);

  if(el && !fel) {
   content += "<div id=\"BambooHR-Footer\">Powered by <a href=\"http://www.bamboohr.com\" target=\"_blank\" rel=\"external\"><img src=\"https://resources.bamboohr.com/images/footer-logo.png\" alt=\"BambooHR - HR software\"/></a></div>";
  }
  el.innerHTML=content;
 }
};

不要手动插入脚本标签。将库导入 angular.json,在 scripts 部分:

"scripts": [
  "./node_modules/yourtablelibrary/build/yourtablelibrary.min.js"
]

参考:https://medium.com/@clintpitzak/how-to-use-external-javascript-libraries-in-angular-8-247baacbdccf

页面加载时执行所有脚本,页面加载后添加到dom的<script>标签不会执行

因此,嵌入脚本标签将不会加载文件接缝的内容 angular 不会重新加载页面。

一个解决方案是使组件实现 AfterInit 接口并在 ngAfterInit 方法中动态导入脚本,如下所示

ngAfterInit() {
   import('./myfile.js')
  }

假设要加载的脚本是myfile.js并且是同一个目录