Как мне включить файл сценария JavaScript в Angular и вызвать функцию из этого сценария?

119

У меня есть файл JavaScript с именем abc.js«общедоступная» функция xyz(). Я хочу вызвать эту функцию в моем проекте Angular. Как я могу это сделать?

Пиюш Джайн
источник

Ответы:

105

Обратитесь к сценариям внутри файла angular-cli.json( angular.jsonпри использовании angular 6+).

"scripts": [
    "../path" 
 ];

затем добавьте typings.d.ts(создайте этот файл, srcесли он еще не существует)

declare var variableName:any;

Импортируйте его в свой файл как

import * as variable from 'variableName';
Аравиндом
источник
9
я добавил путь в скриптах как «скрипты»: [«./assets/common_header_sidebar.js»]; затем в typing.d.ts я написал: declare var commonHeader: any; а затем в моем ts файле я написал import * как commonHeaderModule из commonHeader; но получаю сообщение «Не удается найти модуль commonHeader». ошибка
Пиюш Джайн
6
я могу показаться глупым, если спрашиваю об этом. но как связаны имя файла в пути (объявленное в angular-cli.json) и объявление имени объекта в файле typing.d.ts. так как я импортирую из имени объявленного объекта, а не из файла
Пиюш Джайн
2
plunker
Аравинд
2
сделано с интеграцией, мне просто пришлось объявить функцию в моем ts-файле, где я ее использовал, и импорт не требовался. Благодаря тонну .
Пиюш Джайн
2
@Aravind что делать, если у меня нет файла typing.d.ts в моем проекте Angular 4?
Хабиб
34

Чтобы включить глобальную библиотеку, например jquery.jsфайл в массив скриптов angular-cli.json( angular.jsonпри использовании angular 6+):

"scripts": [
  "../node_modules/jquery/dist/jquery.js"
]

После этого перезапустите ng serve, если он уже запущен.

Рахул Сингх
источник
3
как вы импортируете файл машинописного текста?
alansiqueira27
1
для импорта в файл ts используйте -declare var $: any;
ojus kulkarni
3
Файл angular-cli.json был переименован / заменен на angular.json в версии 6+ Angular.
Ε Г И І И О
22

Добавьте внешний файл js в index.html .

<script src="./assets/vendors/myjs.js"></script>

Вот файл myjs.js :

var myExtObject = (function() {

    return {
      func1: function() {
        alert('function 1 called');
      },
      func2: function() {
        alert('function 2 called');
      }
    }

})(myExtObject||{})


var webGlObject = (function() { 
    return { 
      init: function() { 
        alert('webGlObject initialized');
      } 
    } 
})(webGlObject||{})

Затем объявите, что он находится в компоненте, как показано ниже

demo.component.ts

declare var myExtObject: any;
declare var webGlObject: any;

constructor(){
    webGlObject.init();
}

callFunction1() {
    myExtObject.func1();
}

callFunction2() {
    myExtObject.func2();
}

demo.component.html

<div>
    <p>click below buttons for function call</p>
    <button (click)="callFunction1()">Call Function 1</button>
    <button (click)="callFunction2()">Call Function 2</button>
</div>

У меня работает ...

Нагнат Мунгаде
источник
Очень подробный пример, спасибо, он сработал для меня на angular 6. Ни один из других ответов не работал.
Даниэль Филипе
Fwiw, вот несколько объяснений того, что declareделает - по сути, « declareиспользуется, чтобы сообщить TypeScript, что переменная была создана в другом месте » (из этого ответа ).
Руффин
18

Вы также можете

import * as abc from './abc';
abc.xyz();

или

import { xyz } from './abc';
xyz()
авария
источник
27
что мне делать, если файл где-то размещен, но не в локальном репо?
Пиюш Джайн
ты понял это?
Луис Асейтуно,
Получение ошибок в обоих методах. Ну, у меня есть файл .js в моем проекте, но когда я импортирую первым методом, он дает мне ошибку при компиляции и не может найти ни одного модуля, когда я использую второй метод. И я просто использую гладкий слайдер.
Habib