javascript - mengakses data kelas pada fungsi window typescript


Saya sedang membangun sebuah aplikasi dengan Angular 2 dan saya juga menggunakan YouTube IFrame API.

API Youtube mengharuskan saya untuk mendeklarasikan beberapa fungsi ke objek global, jadi ini kode saya:

export class MyClass {

  someData: any;

  constructor( ... ) {
    ...
  }

  loadAPI(){
    (window as any).onYouTubeIframeAPIReady = function () {
      buildPlayer();
    }

    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    console.log('API loaded');
  }

}

Ini bekerja dengan baik, lalu, di luar kelas saya memiliki ini:

function buildPlayer(){
  player = new YT.Player('player', {
    events: {
      'onReady': onPlayerReady,
      'onStateChange': onPlayerStateChange
    }
  });
  console.log('youtube iframe api ready!');
}

function onPlayerReady(event){
  // HERE IS MY PROBLEM
  // I want to manipulate "someData" in these functions
}

function onPlayerStateChange(status){
  // HERE IS MY PROBLEM
}

Saya ingin memanipulasi beberapa data yang berasal dari MyClass (yang mengambilnya dari database) di dalam fungsi-fungsi ini, tetapi ketika saya mencoba mengaksesnya dengan "this.data" dikatakan bahwa itu tidak terdefinisi. Bagaimana saya bisa melakukannya?

Jawaban #1

Tidak yakin tentang menggunakan Angular 2, tetapi saya pikir itu perlu menjadi "event.data".

Jawaban #2

Saya menemukan jawaban dengan sedikit bantuan dari versi Portugis StackOverflow. Yang harus saya lakukan adalah mendeklarasikan variabel di luar kelas, sama seperti fungsi-fungsi tersebut. Jadi begini:

let someData: any;

export class MyClass {    

    someData: any; // after manipulate the data in here, I can just
                   // set it like this: someData = this.someData;  

    constructor() {

    }

    loadAPI(){
    (window as any).onYouTubeIframeAPIReady = function () {
      buildPlayer();
    }

    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    console.log('API loaded');
    }
} 

function buildPlayer(){
  player = new YT.Player('player', {
    events: {
      'onReady': onPlayerReady,
      'onStateChange': onPlayerStateChange
    }
  });
  console.log('youtube iframe api ready!');
}

function onPlayerReady(event){
    // I can manipulate it here
    console.log(someData);   
}

function onPlayerStateChange(status){
    // I can manipulate it here
    console.log(someData);        
}

Itu adalah hal yang sederhana dan saya berpikir terlalu rumit. Saya harap ini membantu orang lain.