Browse Source

feat(core): lazy load service supports url array

pull/1858/head
mehmet-erim 7 years ago
parent
commit
220d41149d
  1. 84
      npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts

84
npm/ng-packs/packages/core/src/lib/services/lazy-load.service.ts

@ -9,50 +9,66 @@ export class LazyLoadService {
loadedLibraries: { [url: string]: ReplaySubject<void> } = {}; loadedLibraries: { [url: string]: ReplaySubject<void> } = {};
load( load(
url: string, urlOrUrls: string | string[],
type: 'script' | 'style', type: 'script' | 'style',
content: string = '', content: string = '',
targetQuery: string = 'body', targetQuery: string = 'body',
position: InsertPosition = 'afterend', position: InsertPosition = 'afterend',
): Observable<void> { ): Observable<void> {
if (!url && !content) return; if (!urlOrUrls && !content) {
const key = url ? url.slice(url.lastIndexOf('/') + 1) : uuid(); return;
} else if (!urlOrUrls && content) {
if (this.loadedLibraries[key]) { urlOrUrls = [null];
return this.loadedLibraries[key].asObservable();
} }
this.loadedLibraries[key] = new ReplaySubject(); if (!Array.isArray(urlOrUrls)) {
urlOrUrls = [urlOrUrls];
let library;
if (type === 'script') {
library = document.createElement('script');
library.type = 'text/javascript';
if (url) {
(library as HTMLScriptElement).src = url;
}
(library as HTMLScriptElement).text = content;
} else if (url) {
library = document.createElement('link');
library.type = 'text/css';
(library as HTMLLinkElement).rel = 'stylesheet';
if (url) {
(library as HTMLLinkElement).href = url;
}
} else {
library = document.createElement('style');
(library as HTMLStyleElement).textContent = content;
} }
library.onload = () => { return new Observable(subscriber => {
this.loadedLibraries[key].next(); (urlOrUrls as string[]).forEach((url, index) => {
this.loadedLibraries[key].complete(); const key = url ? url.slice(url.lastIndexOf('/') + 1) : uuid();
};
if (this.loadedLibraries[key]) {
return this.loadedLibraries[key].asObservable();
}
this.loadedLibraries[key] = new ReplaySubject();
let library;
if (type === 'script') {
library = document.createElement('script');
library.type = 'text/javascript';
if (url) {
(library as HTMLScriptElement).src = url;
}
(library as HTMLScriptElement).text = content;
} else if (url) {
library = document.createElement('link');
library.type = 'text/css';
(library as HTMLLinkElement).rel = 'stylesheet';
if (url) {
(library as HTMLLinkElement).href = url;
}
} else {
library = document.createElement('style');
(library as HTMLStyleElement).textContent = content;
}
library.onload = () => {
this.loadedLibraries[key].next();
this.loadedLibraries[key].complete();
document.querySelector(targetQuery).insertAdjacentElement(position, library); if (index === urlOrUrls.length - 1) {
subscriber.next();
subscriber.complete();
}
};
return this.loadedLibraries[key].asObservable(); document.querySelector(targetQuery).insertAdjacentElement(position, library);
});
});
} }
} }

Loading…
Cancel
Save