У меня есть этот модуль, который компонентизирует внешнюю библиотеку вместе с дополнительной логикой, не добавляя <script>
тег непосредственно в index.html:
import 'http://external.com/path/file.js'
//import '../js/file.js'
@Component({
selector: 'my-app',
template: `
<script src="http://iknow.com/this/does/not/work/either/file.js"></script>
<div>Template</div>`
})
export class MyAppComponent {...}
Я заметил, что import
спецификация ES6 является статической и разрешается во время переноса TypeScript, а не во время выполнения.
В любом случае, чтобы сделать его настраиваемым, чтобы файл file.js загружался либо из CDN, либо из локальной папки? Как сказать Angular 2 загружать скрипт динамически?
javascript
angular
typescript
ecmascript-6
CallMeLaNN
источник
источник
Ответы:
Если вы используете system.js, вы можете использовать
System.import()
во время выполнения:Если вы используете веб-пакет, вы можете в полной мере воспользоваться его надежной поддержкой разделения кода с помощью
require.ensure
:источник
System
как будущее загрузчика, я думаю.TypeScript Plugin for Sublime Text
не устраиваетSystem
в коде TypeScript:Cannot find name 'System'
но нет ошибки во время передачи и выполнения. ОбаAngular2
иSystem
файл сценария уже добавлены вindex.html
. Во всяком случае для и сделать плагин счастливым?import
System
require()
/import
должен работать как ваш ответ, +1Вы можете использовать следующую технику для динамической загрузки скриптов и библиотек JS по требованию в ваш проект Angular.
script.store.ts будет содержать путь к скрипту локально или на удаленном сервере и имя, которое будет использоваться для динамической загрузки скрипта
script.service.ts - это инъекционный сервис, который будет обрабатывать загрузку скрипта, копировать
script.service.ts
как естьВнедрите это
ScriptService
куда вам нужно и загрузите js libs вот такисточник
this.script.load is not a function
Это может сработать. Этот код динамически добавляет
<script>
тег кhead
html-файлу при нажатии кнопки.источник
new Promise
не решена. Можете ли вы сказать мне,Promise
должен ли я импортировать что-нибудь?Я изменил ответ @rahul kumars, чтобы вместо него использовались Observables:
источник
async
дляtrue
.private scripts: {ScriptModel}[] = [];
. Так и должно бытьprivate scripts: ScriptModel[] = [];
Еще один вариант будет использовать
scriptjs
пакет для этого вопроса, которыйпример
Установите пакет:
и введите определения для
scriptjs
:Затем импортируйте
$script.get()
метод:и, наконец, загрузите ресурс скрипта, в нашем случае это библиотека Google Maps:
демонстрация
источник
Вы можете загрузить несколько скриптов динамически, как это в вашем
component.ts
файле:и вызвать этот метод внутри конструктора,
Примечание. Чтобы другие скрипты загружались динамически, добавьте их в
dynamicScripts
массив.источник
Я сделал этот фрагмент кода с новым API рендерера
А потом назови это так
StackBlitz
источник
У меня есть хороший способ динамически загружать скрипты! Сейчас я использую ng6, echarts4 (> 700Kb), ngx-echarts3 в моем проекте. когда я использую их в документах ngx-echarts, мне нужно импортировать echarts в angular.json: "scripts": ["./ node_modules / echarts / dist / echarts.min.js"], таким образом, в модуль входа, страницу при загрузке скриптов .js, это большой файл! Я не хочу этого
Итак, я думаю, что angular загружает каждый модуль как файл, я могу вставить распознаватель маршрутизатора для предварительной загрузки js, а затем начать загрузку модуля!
// PreloadScriptResolver.service.js
Затем в submodule-routing.module.ts , импортируйте этот PreloadScriptResolver:
Этот код работает хорошо, и он обещает, что: После загрузки файла js модуль начинает загружаться! этот резольвер можно использовать во многих роутерах
источник
Угловое универсальное решение; Мне нужно было дождаться появления определенного элемента на странице, прежде чем загружать скрипт для воспроизведения видео.
источник
Решение @ rahul-kumar хорошо работает для меня, но я хотел вызвать функцию javascript в моей машинописи
Я исправил это, объявив его в машинописи:
И теперь я могу вызвать foo где угодно в моем файле typecript
источник
В моем случае я загрузил
js
иcss
visjs
файлы, и файлы, используя вышеописанную технику - которая прекрасно работает. Я вызываю новую функцию изngOnInit()
Примечание: Я мог бы не получить его нагрузки, просто добавляя
<script>
и<link>
тег в файл HTML шаблона.источник
Привет, вы можете использовать Renderer2 и elementRef с помощью всего лишь нескольких строк кода:
onload
функция может быть использована для вызова функции скрипта после загрузки сценария, это очень полезно , если вы должны делать вызовы в ngOnInit ()источник
@ d123546 Я столкнулся с той же проблемой, и теперь она работает, используя ngAfterContentInit (Lifecycle Hook) в таком компоненте:
источник
источник
образец может быть
файл script-loader.service.ts
и использование
первый впрыск
затем
или
источник