Skip to content

Instantly share code, notes, and snippets.

@VaLeXaR
Forked from changhuixu/quill-editor.component.ts
Last active April 3, 2019 08:23
Show Gist options
  • Save VaLeXaR/6b79b1ff388e00078cb53f8f1f9ef082 to your computer and use it in GitHub Desktop.
Save VaLeXaR/6b79b1ff388e00078cb53f8f1f9ef082 to your computer and use it in GitHub Desktop.
Lazy Load External JavaScript Library in Angular #tags: Angular
declare var Quill: any;
@Component({
//...
})
export class QuillEditorComponent implements OnInit {
constructor(
// ...
private readonly svc: QuillEditorService,
@Inject(DOCUMENT) private readonly document: any
) {}
ngOnInit() {
this.svc.lazyLoadQuill().subscribe(_ => {
if (!Quill) {
Quill = this.document.defaultView.Quill;
}
this.setupQuill();
});
}
setupQuill() {
if (!Quill) {
return;
}
// set up External JS library
}
}
import { Injectable, Inject } from '@angular/core';
import { ReplaySubject, Observable, forkJoin } from 'rxjs';
import { DOCUMENT } from '@angular/common';
@Injectable({
providedIn: 'root'
})
export class QuillEditorService {
private _loadedLibraries: { [url: string]: ReplaySubject<any> } = {};
constructor(@Inject(DOCUMENT) private readonly document: any) {}
lazyLoadQuill(): Observable<any> {
return forkJoin([
this.loadScript('assets/quill/quill.min.js'),
this.loadStyle('assets/quill/quill.snow.css')
]);
}
private loadScript(url: string): Observable<any> {
if (this._loadedLibraries[url]) {
return this._loadedLibraries[url].asObservable();
}
this._loadedLibraries[url] = new ReplaySubject();
const script = this.document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = url;
script.onload = () => {
this._loadedLibraries[url].next();
this._loadedLibraries[url].complete();
};
this.document.body.appendChild(script);
return this._loadedLibraries[url].asObservable();
}
private loadStyle(url: string): Observable<any> {
if (this._loadedLibraries[url]) {
return this._loadedLibraries[url].asObservable();
}
this._loadedLibraries[url] = new ReplaySubject();
const style = this.document.createElement('link');
style.type = 'text/css';
style.href = url;
style.rel = 'stylesheet';
style.onload = () => {
this._loadedLibraries[url].next();
this._loadedLibraries[url].complete();
};
const head = document.getElementsByTagName('head')[0];
head.appendChild(style);
return this._loadedLibraries[url].asObservable();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment