Как передать метод класса машинописного текста Angular4 в качестве обратного вызова для функции Javascript

1

У меня есть угловая служба 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))
      }
  }

Спасибо, оцените за ваше время.

  • 0
    В вашем примере недостаточно информации, чтобы рассказать, как это исправить, но, похоже, вам нужно выяснить, где находится ваш JavascriptAPI в глобальном пространстве имен, и назначить его этой переменной. Поэтому, если бы существовал объект window.JavascriptAPI, вы бы написали что-то вроде этого: объявите var JavascriptAPI: any = window.JavascriptAPI. Не знаю, где этот код живет, но это основная концепция. Обычно я просто устанавливаю точку останова, когда сталкиваюсь с этими проблемами и проверяю, что происходит в объекте окна, чтобы выяснить, как ссылаться на код
  • 0
    Спасибо за ваш быстрый ответ, я хотел бы знать, как я передаю метод машинописи onMessage как функцию в функцию JavascriptAPI.setMessageHandler () правильно / неправильно? Это правильный подход? webpack жалуется, что onMessage не является функцией.
Показать ещё 4 комментария
Теги:
angular
typescript2.0

1 ответ

1

Таким образом, у вас есть эта функция 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" на основе взгляда на его код, попробуйте помещать точку останова где-то и смотреть на объект окна, чтобы увидеть, где он там живет, и ссылаться на него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню