У меня есть угловая служба 4, в которой используется внешний файл JavaScript, мне нужно передать функцию в качестве аргумента для одной из функций JavaScript, таких как JavascriptAPI.setMessageHandler(this.onMessage.bind(this)) JavascriptAPI.setStatusHandler(this.onStatus.bind (этот)).
Когда я запускаю это, я получаю следующую ошибку: polyfills.bundle.js: 2610 Uncaught TypeError: JavascriptAPI.be не является функцией в WebSocket.e2.onopen(eval at webpackJsonp.../../../../script-loader/addScript.js.module.exports(scripts.bundle.js: 28),: 69: 404) в WebSocket.wrapFn [as __zone_symbol___onopen] (polyfills.bundle.js: 3484) в ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask(polyfills.bundle.js: 2839) в Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask(polyfills.bundle.js: 2606) в ZoneTask.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (polyfills.bundle.js: 2913) в invokeTask (polyfills.bundle.js: 3779) в WebSocket.globalZoneAwareCallback(polyfills.bundle.js: 3797)
import { Injectable } from '@angular/core'
declare var JavascriptAPI: any;
@Injectable()
export class SampleService {
constructor() { }
onMessage(messages) {
console.log('onMessage', messages)
}
onStatus(messages) {
console.log('onStatus', messages)
}
onInit(token: string) {
JavascriptAPI.disconnect()
JavascriptAPI.setConnect(token)
const serverUrl = ['http://localhost:8080']
JavascriptAPI.setServers(serverUrl)
JavascriptAPI.setMessageHandler(this.onMessage.bind(this))
JavascriptAPI.setStatusHandler(this.onStatus.bind(this))
}
}
Спасибо, оцените за ваше время.
Таким образом, у вас есть эта функция javascript, которая живет за пределами пространства имен для вашего машинописного текста, "Javascript API".
Скажем, скрипт для JavascriptAPI выглядит так:
<script>
var JavascriptAPI = function(){
return {
disconnect: function() {},
setConnect: function(token),
// more functions
}
}
</script>
Когда вы запустите этот скрипт, он создаст переменную внутри глобального пространства имен, к которой можно получить доступ через объект окна. Попробуйте удалить теги "script" и запустить его в консоли.
Пока вы находитесь на консоли, есть два способа доступа к этой переменной. Вы можете ввести "JavascriptAPI", и неудивительно, что вы увидите возвращаемую функцию. Это второй способ, который касается нас больше. Попробуйте ввести "window.JavascriptAPI" в консоли. Вы увидите то же значение. Это переменная, которую вы хотите указать в своем компоненте при объявлении переменной.
Теперь это всего лишь гипотетическая реализация вашей функции JavascriptAPI. Но дело в том, что вы хотите выяснить, где он живет в пространстве имен вашего приложения, как только он будет запущен. Итак, если он работает, как этот пример
declare var JavascriptAPI: any = window.JavascriptAPI;
Машинопись может вызывать ошибку/предупреждение о том, что свойство JavascriptAPI не существует в окне типа. Там могут быть более эффективные способы обойти ошибку, если она всплывает, но здесь один из способов сделать это.
var windowCopy = window as any;
declare var JavascriptAPI: any = windowCopy.JavascriptAPI;
Другими словами, вы можете захотеть использовать вторую часть кода, чтобы не получать предупреждения с помощью машинописного текста, но концепция одинаков.
Если вы не можете понять, как ссылаться на "JavascriptAPI" на основе взгляда на его код, попробуйте помещать точку останова где-то и смотреть на объект окна, чтобы увидеть, где он там живет, и ссылаться на него.