Angular 6 - 在组件级别添加脚本并检查它是否存在
Angular 6 - Adding script at component level and checking if it exists
我有一个脚本,我只想 运行 在一个组件上。我已经设法在组件上添加脚本,但是发生了一些我不确定如何解决的事情。
- 如果我导航到组件,脚本会添加到 DOM,但它不会触发。如果我刷新页面,它会工作
- 如果我导航到另一个组件并return,脚本会再次添加,并且可以继续构建
component.ts
import { Component, OnInit } from '@angular/core';
import { Renderer2, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit {
constructor(private _renderer2: Renderer2, @Inject(DOCUMENT) private _document) {
let s = this._renderer2.createElement('script');
s.type = `text/javascript`;
s.src = `../../assets/scripts/privacy.js`;
this._renderer2.appendChild(this._document.body, s);
}
ngOnInit() {
}
}
您在 运行 这个 js 文件中的方法是错误的,您应该执行以下操作以干净的方式实现此目的:
- 将您的 js 文件添加到资产中(例如 assets/js/privacy.js)
- 将文件添加到 .angular-cli.json 脚本
- 现在你可以从 angular 组件中调用你的 js 函数,前提是你在组件中声明它们
angular-cli.json
"scripts": [
"assets/js/privacy.js"
]
component.ts
import { Component, OnInit } from '@angular/core';
declare function myFunc(): any; // function from privacy.js
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit {
constructor() {
}
ngOnInit() {
myFunc(); // call it
}
}
您需要将 onload
(如果您需要支持 IE 确保也支持 onreadystatechange
)处理程序添加到您的脚本元素,它可以调用您要在脚本时执行的函数加载完毕。
要删除 onNgDestroy 脚本,请在组件上保存 createElement?
的引用,并在 Destroy 生命周期挂钩中删除它。
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Renderer2, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit, OnDestroy {
private s: any;
constructor(private _renderer2: Renderer2, @Inject(DOCUMENT) private _document) {
this.s = this._renderer2.createElement('script');
this.s.type = `text/javascript`;
this.s.src = `../../assets/scripts/privacy.js`;
this.s.onload = this.doneLoading;
this._renderer2.appendChild(this._document.body, this.s);
}
doneLoading () {
// do what you need to do
}
ngOnDestroy() {
// this removes the script so it won't be added again when the component gets initialized again.
this._renderer2.removeChild(this._document.body, this.s)
}
ngOnInit() {
}
}
我有一个脚本,我只想 运行 在一个组件上。我已经设法在组件上添加脚本,但是发生了一些我不确定如何解决的事情。
- 如果我导航到组件,脚本会添加到 DOM,但它不会触发。如果我刷新页面,它会工作
- 如果我导航到另一个组件并return,脚本会再次添加,并且可以继续构建
component.ts
import { Component, OnInit } from '@angular/core';
import { Renderer2, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit {
constructor(private _renderer2: Renderer2, @Inject(DOCUMENT) private _document) {
let s = this._renderer2.createElement('script');
s.type = `text/javascript`;
s.src = `../../assets/scripts/privacy.js`;
this._renderer2.appendChild(this._document.body, s);
}
ngOnInit() {
}
}
您在 运行 这个 js 文件中的方法是错误的,您应该执行以下操作以干净的方式实现此目的:
- 将您的 js 文件添加到资产中(例如 assets/js/privacy.js)
- 将文件添加到 .angular-cli.json 脚本
- 现在你可以从 angular 组件中调用你的 js 函数,前提是你在组件中声明它们
angular-cli.json
"scripts": [
"assets/js/privacy.js"
]
component.ts
import { Component, OnInit } from '@angular/core';
declare function myFunc(): any; // function from privacy.js
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit {
constructor() {
}
ngOnInit() {
myFunc(); // call it
}
}
您需要将 onload
(如果您需要支持 IE 确保也支持 onreadystatechange
)处理程序添加到您的脚本元素,它可以调用您要在脚本时执行的函数加载完毕。
要删除 onNgDestroy 脚本,请在组件上保存 createElement?
的引用,并在 Destroy 生命周期挂钩中删除它。
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Renderer2, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
@Component({
selector: 'app-privacy',
templateUrl: './privacy.component.html',
styles: []
})
export class PrivacyComponent implements OnInit, OnDestroy {
private s: any;
constructor(private _renderer2: Renderer2, @Inject(DOCUMENT) private _document) {
this.s = this._renderer2.createElement('script');
this.s.type = `text/javascript`;
this.s.src = `../../assets/scripts/privacy.js`;
this.s.onload = this.doneLoading;
this._renderer2.appendChild(this._document.body, this.s);
}
doneLoading () {
// do what you need to do
}
ngOnDestroy() {
// this removes the script so it won't be added again when the component gets initialized again.
this._renderer2.removeChild(this._document.body, this.s)
}
ngOnInit() {
}
}