2012-02-24 79 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

相关问题