I have a problem where I need to use a specific 3rd party library to generate a nonce to use the square connect api. I am having troubles finding how to load the external javascript library since they don't have a node_module that I can load like I usually do. By external library I mean something like this <script src="https://js.squareup.com/v2/paymentform " type="text/javascript"> I have not found a good way to to load this into my application so that I can use it. Any ideas on how I can solve this problem?
-
If you use angular-cli you should put it in the script section in .angular-cli.jsonmostafa tourad– mostafa tourad2017-12-29 18:19:06 +00:00Commented Dec 29, 2017 at 18:19
-
Use this stackoverflow.com/questions/34489916/…Rahul Kumar– Rahul Kumar2018-05-24 17:15:35 +00:00Commented May 24, 2018 at 17:15
Add a comment
|
2 Answers
A few options that I have used:
Global script using angular-cli
"scripts": [ "global-script.js", { "input": "lazy-script.js", "lazy": true }, { "input": "pre-rename-script.js", "output": "renamed-script" }, ]Require in a specific module
import { NgModule } from '@angular/core'; ... require('chart.js'); require('../../libs/chartjs-plugin-annotation'); ...Add a global script at runtime based on some condition
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
7 Comments
Jonathan Jensen
On option number one do you have to download the script first or can I put the link url?
tristansokol
@JonathanJensen just an FYI, you aren't allowed (by Square) to download the script and include it, so options like number 3 are going to be better for you.
Sumama Waheed
@JonathanJensen you can put the url in option 1 also
Jonathan Jensen
@tristansokol Thanks for the update. I am aware of them not allowing the downloading of their scripts which is why I asked the question. But if I did not know about it then that would have been helpful. So thank you.
Jonathan Jensen
@SumamaWaheed When I try option number one I get this error: ERROR in multi script-loader!./src/https:/js.squareup.com/v2/paymentform Module not found: Error: Can't resolve '/Users/jpjensen/Projects/build-a-bracelet/front-end/src/https:/js.squareup.com/v2/paymentform' in '/Users/jpjensen/Projects/build-a-bracelet/front-end/node_modules/@angular/cli/models/webpack-configs' @ multi script-loader!./src/https:/js.squareup.com/v2/paymentform code gist.github.com/jonje/703071339542964bed461742f10c5c90
|
First Approach:
Refer the scripts inside the angular-cli.json file.
"scripts": [
"../path"
];
Second Approach
You can create your own directive to load script as below
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);
}
}
HOW TO USE
<i appLoadScript [script]="'https://js.squareup.com/v2/paymentform'"></i>
1 Comment
umutesen
Second approach works well, but I prefer the first one. Is there a way to make use of environment variables with the first approach? I need to inject in an API key.