【问题标题】:How to load External Javascript Libraries into Angular 4 components如何将外部 Javascript 库加载到 Angular 4 组件中
【发布时间】:2017-12-30 03:52:29
【问题描述】:

我有一个问题,我需要使用特定的 3rd 方库来生成随机数以使用 square connect api。我很难找到如何加载外部 javascript 库,因为它们没有我可以像往常一样加载的 node_module。通过外部库,我的意思是像 <script src="https://js.squareup.com/v2/paymentform " type="text/javascript"> 这样的东西我还没有找到一个很好的方法来将它加载到我的应用程序中以便我可以使用它。关于如何解决这个问题的任何想法?

【问题讨论】:

标签: javascript angular square-connect


【解决方案1】:

我使用过的几个选项:

  1. 使用angular-cli的全局脚本

    "scripts": [
       "global-script.js",
       { "input": "lazy-script.js", "lazy": true },
       { "input": "pre-rename-script.js", "output": "renamed-script" },
    ]
    
  2. 在特定模块中需要

    import { NgModule } from '@angular/core';
    ...
    require('chart.js');
    require('../../libs/chartjs-plugin-annotation');
    ...
    
  3. 在运行时根据某些条件添加一个全局脚本

    if (this.usesCKEditor(permissions) && !window['CKEDITOR']) {
        const url = '//cdn.ckeditor.com/4.7.3/full/ckeditor.js';
        const script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = url;
        document.body.appendChild(script);
    }
    // must check if the script has loaded before using it
    

【讨论】:

  • 在第一个选项上你必须先下载脚本还是我可以放链接网址?
  • @JonathanJensen 仅供参考,Square 不允许您下载脚本并将其包含在内,因此像数字 3 这样的选项对您来说会更好。
  • @JonathanJensen 您也可以将网址放在选项 1 中
  • @tristansokol 感谢您的更新。我知道他们不允许下载他们的脚本,这就是我问这个问题的原因。但是,如果我不知道它,那将是有帮助的。所以谢谢你。
  • @SumamaWaheed 当我尝试第一个选项时,我收到此错误:多脚本加载器中的错误!./src/https:/js.squareup.com/v2/paymentform 未找到模块:错误:无法解析 '/Users/jpjensen/Projects/build-a- 中的 '/Users/jpjensen/Projects/build-a-bracelet/front-end/src/https:/js.squareup.com/v2/paymentform'手镯/前端/node_modules/@angular/cli/models/webpack-configs' @multi script-loader!./src/https:/js.squareup.com/v2/paymentform 代码gist.github.com/jonje/703071339542964bed461742f10c5c90
【解决方案2】:

第一种方法:

参考angular-cli.json 文件中的脚本。

"scripts": [
    "../path" 
 ];

第二种方法

您可以创建自己的指令来加载脚本,如下所示

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

@Directive({
    selector: '[appLoadScript]'
})
export class LoadScriptDirective implements OnInit{

    @Input('script') param:  any;

    ngOnInit() {
        let node = document.createElement('script');
        node.src = this.param;
        node.type = 'text/javascript';
        node.async = false;
        node.charset = 'utf-8';
        document.getElementsByTagName('head')[0].appendChild(node);
    }

}

如何使用

<i appLoadScript  [script]="'https://js.squareup.com/v2/paymentform'"></i>

DEMO

【讨论】:

  • 第二种方法效果很好,但我更喜欢第一种。有没有办法通过第一种方法利用环境变量?我需要注入一个 API 密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2017-10-27
  • 2018-01-12
  • 1970-01-01
  • 2018-03-10
  • 2016-04-05
相关资源
最近更新 更多