import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; @Injectable({ providedIn: 'root', }) export class MonacoEditorService { loaded: boolean = false; public loadingFinished: Subject = new Subject(); constructor() {} private finishLoading() { this.loaded = true; this.loadingFinished.next(); } public load() { // load the assets const baseUrl = './assets' + '/monaco-editor/min/vs'; if (typeof (window).monaco === 'object') { this.finishLoading(); return; } const onGotAmdLoader: any = () => { // load Monaco (window).require.config({ paths: { vs: `${baseUrl}` } }); (window).require([`vs/editor/editor.main`], () => { this.finishLoading(); }); }; // load AMD loader, if necessary if (!(window).require) { const loaderScript: HTMLScriptElement = document.createElement('script'); loaderScript.type = 'text/javascript'; loaderScript.src = `${baseUrl}/loader.js`; loaderScript.addEventListener('load', onGotAmdLoader); document.body.appendChild(loaderScript); } else { onGotAmdLoader(); } } }