сценарий действия 3 - «Ошибка № 1006: startDrag не является функцией» - PullRequest
0 голосов
/ 24 февраля 2012

Я писал код для механизма перетаскивания, который вызывает ожидание в течение небольшого периода времени перед началом операции перетаскивания.

Но я получаю это сообщение об ошибке в функции 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 из this

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

Может кто-нибудь сказать мне, почему это происходит?

1 Ответ

1 голос
/ 24 февраля 2012

Причиной сбоя startDrag при использовании «this» является то, что вы вызываете его из «анонимной функции», что означает, что ключевое слово «this» больше не будет ссылаться на основной класс и вместо этого ссылается на определение функции. «Анонимная функция» - это, по сути, функция, которая не привязана к определенному классу, подробнее здесь .

Альтернативный способ выполнить то, что вы хотели бы сделать, показан ниже:

    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' в этих функциях теперь будет правильно ссылаться на основной класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...