2016-10-02 94 views
0

我可能missunderstood了一些概念,但在閱讀4個主題上的stackoverflow和「私人成員在打字稿」的文檔 - 我仍然困惑。打字稿私人方法「不是一個功能」

我正在寫簡單的鼠標IO(第一個打字稿項目)。這是發生故障的鼠標類的全碼:

class Mouse { 
    public left: MouseKeyData = new MouseKeyData(); 
    public right: MouseKeyData = new MouseKeyData(); 
    public whell: MouseKeyData = new MouseKeyData(); 

    public x: number = 0; 
    public y: number = 0; 

    private crossBrowserButton(e: any):string { 
     switch (e.button) { 
      case 0: return 'left'; 
      case 1: return 'whell'; 
      case 2: return 'right'; 
      case 3: return 'back'; 
      case 4: return 'forward'; 
     } 
     return 'none'; 
    } 


    private onMouseDown(e: any):void { 
     let target: MouseKeyData = this.left; 
     try {console.log(this.crossBrowserButton(e))} catch (a) {console.warn(a)} finally {} 
     if(target) { 
      target.press(); 
     } 
    } 

    private onMouseUp(e: any):void { 
     let target: MouseKeyData = this.left; 
     if(target) { 
      target.release(); 
     } 
    } 

    private onMouseMove(e: any): void { 
     this.x = e.pageX; 
     this.y = e.pageY; 
    } 

    public constructor() { 
     let anchor = document.body; 

     anchor.addEventListener('mousedown', this.onMouseDown); 
     anchor.addEventListener('mouseup', this.onMouseUp); 
     anchor.addEventListener('mousemove', this.onMouseMove); 

    } 
} 

我習慣叫this.crossBrowserButton(e)onMouseDownonMouseUp,但我只this.crossBrowserButton is not a function(…)了。

我覺得我失去了this範圍一些在這裏,但this.left完美的作品。

在此先感謝!

+0

我正在投票結束這個問題,因爲這個錯誤在低技術水平的世界很常見,我想通了什麼是錯的。 –

回答

1

聽起來像你做了你應該做的完全相反。在您的原始代碼中,您的事件偵聽器的執行範圍存在問題。它們不受類的範圍限制,因此將在它們運行的​​上下文中執行。

你的事件綁定應該看起來像這樣。

anchor.addEventListener('mousedown', this.onMouseDown.bind(this)); 
    anchor.addEventListener('mouseup', this.onMouseUp.bind(this)); 
    anchor.addEventListener('mousemove', this.onMouseMove.bind(this)); 
0

好吧,我想通了:我綁定this到document.body中,然後 - 我把這個this的方法。

感謝您的評價。晚安夥計!