javascript - pristupanje podacima klase na window funkciji typescript


Izrađujem aplikaciju s Angular 2 i također koristim YouTube IFrame API.

YouTube API zahtijeva da neke funkcije deklariram u globalnom objektu, pa je ovo moj kod:

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');
  }

}

Radi dobro, onda, izvan klase imam ovo:

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
}

Želim manipulirati nekim podacima koji dolaze iz MyClass (koja ih dohvaća iz baze podataka) unutar ovih funkcija, ali kada pokušam pristupiti njima s "this.data" kaže da je neodređeno. Kako to mogu napraviti?

Odgovor #1

Nisam siguran u korištenje Angular 2, ali mislio bih da treba biti "event.data".

Odgovor #2

Pronašao sam odgovor uz malu pomoć portugalske verzije StackOverflowa. Ono što sam trebao učiniti je deklarirati varijablu izvan klase, baš kao i funkcije. Dakle, izgleda ovako:

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);        
}

Bila je to jednostavna stvar, a ja sam razmišljao prekomplicirano. Nadam se da će ovo pomoći nekome drugome.