Вставить <script> в Angular компонент

Примитивный способ. Аналогичен нативной вставке скрипта в тело документа.

  constructor(
    @Inject(DOCUMENT) private document: Document,
    private renderer2: Renderer2
  ) {}

  ngOnInit(): void {
    const textScript = this.renderer2.createElement('script');
    textScript.src = 'https://code.jquery.com/jquery-3.3.1.slim.min.js';
    this.renderer2.appendChild(this.document.body, textScript);

    const srcScript = this.renderer2.createElement('script');
    srcScript.type = 'text/javascript';
    srcScript.text = `
      (function() {
        console.log('Hello from Siberia!')
      }());
    `;
    this.renderer2.appendChild(this.document.body, srcScript);
  }

Чуть более навороченный способ: завернуть в обещание.

 ngOnInit() {
    this.loadScript('https://code.jquery.com/jquery-3.3.1.slim.min.js').then(
      () => this.loadTextScript(`
          setTimeout(() => {
            $( "#promise-based" ).html( "PromiseBasedComponent..." )
          }, 2000);
      `)
    );
  }

  loadTextScript(text: string) {
    return new Promise(resolve => {
      const script = this.renderer2.createElement('script');
      script.text = text;
      this.renderer2.appendChild(this.document.body, script);
      resolve();
    });
  }

  loadScript(url: string) {
    return new Promise((resolve, reject) => {
      const script = this.renderer2.createElement('script');
      script.src = url;
      script.onload = resolve;
      script.onerror = reject;
      this.renderer2.appendChild(this.document.body, script);
    });
  }

Еще один подход, предложенный Алексеем Зуевым: использование ReplaySubject в сервисе:


Похожие записи

RxJS Pipeable Operators

Начиная с версии rxjs 5.5 операторы вместо цепочки вызовов применяются как параметры функции pipe.