2012-02-24 78 views
0

我正在編寫拖動機制的代碼,它在啓動拖動操作之前調用等待一小段時間。動作腳本3 - 「錯誤#1006:startDrag不是函數」

但我在mouseDownHandler()函數中收到此錯誤消息。

TypeError: Error #1006: startDrag is not a function. 
    at Function/<anonymous>()[C:\blahblah_8216\bobo\flex2\src\ui\map\WorldMap.as:105] 
    at Function/http://adobe.com/AS3/2006/builtin::apply() 
    at SetIntervalTimer/onTimer() 
    at flash.utils::Timer/_timerDispatch() 
    at flash.utils::Timer/tick() 

我已經通過聲明一個克隆可變的_me

private var _me:WorldMap; 

實例化它在構造

public function WorldMap(){ 
    _me = this; 
} 

更換稍微改變的代碼中發現的溶液這_me在下面的代碼工作沒有錯誤

代碼

public var dragInProgress:Boolean = false; 
    private var dragTime:int = 100; 
    private var dragInProgressInt:int; 




    private function mouseDownHandler(event:MouseEvent):void { 
     trace(this.name," mouse down ",getTimer()); 

     dragInProgressInt = setTimeout(function():void 
     { 
      dragInProgress = true; 

      this.startDrag(false,new Rectangle(Config.GAME_SCREEN_WIDTH - Config.FULL_GAME_SCREEN_WIDTH, 
       Config.GAME_SCREEN_HEIGHT - Config.FULL_GAME_SCREEN_HEIGHT, 
       Config.FULL_GAME_SCREEN_WIDTH - Config.GAME_SCREEN_WIDTH, 
       Config.FULL_GAME_SCREEN_HEIGHT - Config.GAME_SCREEN_HEIGHT)); 
     }, dragTime); 

    } 



    private function mouseUpHandler(event:MouseEvent):void { 

     clearTimeout(dragInProgressInt); 

     setTimeout(function():void 
     { 
      dragInProgress = false; 
      this.stopDrag(); 

     }, 1); 

誰能告訴我爲什麼發生這種情況?

+0

如果您自己修復此問題,請發佈答案並接受答案,以便其他人也意識到這一點。謝謝。 – pkyeck 2012-02-24 10:13:01

回答

1

當您使用'this'時,startDrag失敗的原因是您從'匿名函數'中調用它,這意味着'this'關鍵字將不再引用主類,而是引用函數定義。一個'匿名函數'基本上是一個函數,不會被綁定到一個特定的類,read more here

另一種方式來完成你想要做以下證明什麼:現在

public var dragInProgress:Boolean = false; 
    private var dragTime:int = 100; 
    private var dragInProgressInt:int; 




    private function mouseDownHandler(event:MouseEvent):void { 
     trace(this.name," mouse down ",getTimer()); 

     dragInProgressInt = setTimeout(mouseDownFinished, dragTime); 

    } 



    private function mouseUpHandler(event:MouseEvent):void { 

     clearTimeout(dragInProgressInt); 

     setTimeout(mouseUpFinished, 1); 
    } 


    private function mouseDownFinished():void 
    { 
     dragInProgress = true; 

     this.startDrag(false,new Rectangle(Config.GAME_SCREEN_WIDTH - Config.FULL_GAME_SCREEN_WIDTH, 
      Config.GAME_SCREEN_HEIGHT - Config.FULL_GAME_SCREEN_HEIGHT, 
      Config.FULL_GAME_SCREEN_WIDTH - Config.GAME_SCREEN_WIDTH, 
      Config.FULL_GAME_SCREEN_HEIGHT - Config.GAME_SCREEN_HEIGHT)); 
    } 

    private function mouseUpFinished():void 
    { 
     dragInProgress = false; 
     this.stopDrag(); 

    } 

通知的功能與「setTimeout的」通過使用函數名的引用主類中定義。在這些函數中使用'this'現在將正確引用主類。

+0

+1表示正確的方式。 – 2012-02-24 14:29:46

相關問題