Angular 5 - сценарий загрузки после загрузки представления

У меня есть устаревший скрипт, который мне нужно включить в мое угловое приложение. Особенность этого сценария в том, что он относится к определенному компоненту и должен быть загружен только после загрузки представления компонента. На сегодняшний день мне удалось включить его в функцию OnInit, но иногда (не всегда по какой-то причине) CLI выдает ошибку об этом.

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-player-page',
  templateUrl: './player-page.component.html',
  styleUrls: ['./player-page.component.scss']
})
export class PlayerPageComponent implements OnInit {
  public itemId: string;
  
  constructor() {}

  ngOnInit() {
    //We loading the player srcript on after view is loaded
    require('assets/scripts/player/player.js');
  }

}

Сценарий предполагает, что элементы в пользовательском интерфейсе существуют, и ищет их по идентификатору. При добавлении вверху страницы не работает. Как лучше всего добиться желаемого поведения?

У меня была аналогичная проблема с Google Maps. Решение, которое я нашел, заключалось в создании тега <script> и вставке его в заголовок / тело.

Jorgeblom 03.07.2018 10:12

Какую ошибку выдает клик? а на ngOnInit представление еще не отображается, вам следует использовать ngAfterViewInit. Вероятно, не имеет значения, потому что загрузка js должна занимать больше времени, чем приложение для перехода с onInit на afterViewInit.

Poul Kruijt 03.07.2018 10:27

ОШИБКА в src / app / player-page / player-page.component.ts (14,5): ошибка TS2304: не удается найти имя 'require'. @PierreDuc благодарит за помощь. Я изменил его на ngAfterViewInit

Tal Humy 03.07.2018 10:49

@Jorgeblom - Angular игнорирует теги скрипта в компонентах HTML, насколько мне известно

Tal Humy 03.07.2018 10:51

@TalHumy просто добавьте declare const require: any; поверх своего компонента, вы также можете использовать стандартный динамический импорт машинописного текста: import('assets/scripts/player/player.js');

Poul Kruijt 03.07.2018 10:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
4 911
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько решений этой проблемы.

  1. объявите константу require поверх вашего компонента

    declare const require: any;
    
    import { Component, OnInit } from '@angular/core';
    
    @Component({})
    ...
    
  2. использовать динамическую функцию import() из машинописного текста

    ngAfterViewInit() {
      //We loading the player script on after view is loaded
      import('assets/scripts/player/player.js');
    }
    
  3. измените библиотеку, чтобы она запускалась только после вызова функции из компонента, таким образом вы можете добавить ее в массив скриптов вашего angular.json

Использование импорта решило это - так просто, что я не знаю, почему я использовал require. Третий вариант хорош, но он заставит меня сменить другие проекты. Большое спасибо

Tal Humy 03.07.2018 11:31

Другие вопросы по теме