【问题标题】:How to load the script file immediately (dynamically added) before continue?如何在继续之前立即加载脚本文件(动态添加)?
【发布时间】:2018-02-25 23:37:13
【问题描述】:

我已经在 angular home.component.ts 文件中加载了如下代码的脚本文件

export class HomeComponent {
    constructor() {
        this.loadDynmicallyScript();
    } 
     public loadDynmicallyScript() {
        var script = document.createElement('script');
        script.src = "../node_modules/xxxxxx/i18n/xx.min.js";
        script.async =false;
        document.head.appendChild(script);

     }

但是这个文件是在组件创建之后才加载的。因此,在这种情况下,它不使用此文件。一旦我附加到文档中,我想加载这个文件。如何做到这一点?

【问题讨论】:

标签: angular typescript sleep script-tag


【解决方案1】:

你可以返回一个承诺来链式调用

export class HomeComponent {
    constructor() {
        this.loadDynmicallyScript()
        .then(() => {
          this.doSomethingWhenScriptIsLoaded();
        });
    } 
     public loadDynmicallyScript():Promise {
        var script = document.createElement('script');
        script.src = "../node_modules/xxxxxx/i18n/xx.min.js";
        script.async =false;
        document.head.appendChild(script);
        return Promise((resolve, reject) => {
          script.onload = resolve;
        });    
     }

或者只是将一个函数传递给onLoad,以便在加载脚本时调用

export class HomeComponent {
    constructor() {
        this.loadDynmicallyScript()
    } 
     public loadDynmicallyScript():Promise {
        var script = document.createElement('script');
        script.src = "../node_modules/xxxxxx/i18n/xx.min.js";
        script.async =false;
        document.head.appendChild(script);
        script.onload = () => this.doSomethingWhenScriptIsLoaded();
     }

【讨论】:

  • 真的有可能在运行时通过 prod 构建从 node_modules 加载脚本吗?我从来没有想过要尝试,所以我很好奇。
  • 好点。我什至没有检查问题中的路径。我想这取决于构建步骤的确切作用。他可能需要在其他地方提供该方法。
  • 嗨,这是否可以让等待而不是调用函数(doSomethingWhenScriptIsLoaded)
  • 文件../node_modules/...在开发过程中可能存在,但在构建输出目录中不存在。我自己没有使用 TypeScript,所以我不确定。您可能需要将脚本文件复制到某个资产目录或复制到构建输出的类似目录。我假设从../node_modules 导入的所有文件都只是编译为一个或几个xxx.js 文件,其余的被忽略。
  • 为了访问 node_modules/生产中的任何文件,只需将其添加到 .angular-cli JSON 文件中的 assets 部分: "assets": [ "assets", "favicon.ico", { “glob”:“xx.min.js”,“input”:“../node_modules/xxxxxx/i18n/xx.min.js”,“output”:“./assets/”}],然后在生产中文件将在 /assets/xx.min.js 下可用
猜你喜欢
  • 1970-01-01
  • 2014-08-21
  • 2019-01-28
  • 2017-07-24
  • 1970-01-01
  • 2023-04-09
  • 2022-09-24
  • 1970-01-01
  • 2012-01-28
相关资源
最近更新 更多