網站搜尋

javascript - 在 window 函數中存取類別資料 typescript


我正在使用 Angular 2 建立一個應用程式,而且我也在使用 YouTube IFrame API。

YouTube API 要求我將一些函數聲明到全域物件,所以這是我的程式碼:

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

}

那它運作正常,然後,在課堂外我有這個:

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
}

我想在這些函數中操作一些來自 MyClass(它是從資料庫中獲取的)的資料,但當我嘗試用「this.data」訪問它時,它說未定義。我該怎麼做?

答案#1

不確定是否使用 Angular 2,但我認為它應該是「event.data」。」

答案#2

我在葡萄牙語版的 Stack Overflow 上找到了一些幫助得到的答案。我必須做的是像函數一樣,在類之外聲明變量。所以它是這樣的:

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

這是一件簡單的事情,而我想得太複雜了。我希望這能幫助其他人。