Как вы связываете переменную с функцией в as3 - PullRequest
2 голосов
/ 08 июня 2011

У меня есть этот код:

for each(var tool in tools){
tool.addEventListener(MouseEvent.MOUSE_DOWN, function(){
    trace(tool); //Always the last tool  
 });
}

Как связать значение инструмента с функцией, чтобы она была доступна при обратном вызове?

Ответы [ 5 ]

6 голосов
/ 08 июня 2011

Вы должны использовать функцию внутри функции, чтобы правильно связать область видимости. Это своего рода хак в AS3. Лучше не спускаться по этой кроличьей норе, если вы можете ей помочь. Если нужно, хотя ...

for(var tool:Tool in _tools){
  var getHandler(scope:Tool):Function{
    var t:Tool = scope;
    return function(e:MouseEvent):void{trace(t)}
  }
  tool.addEventListener(MouseEvent.CLICK, getHandler(tool));
}

РЕДАКТИРОВАТЬ: И, конечно, любые переменные, с которыми вам нужно работать в обработчике, также должны быть переданы в getHandler ... так что вместо того, чтобы просто принимать параметр области действия, вы также передали бы свой идентификатор, число, текущее состояние или что угодно.

EDIT2: Но задайте себе этот вопрос. Как вы удалите этот прослушиватель событий? Это самая главная причина, по которой я говорю, чтобы полностью избежать этой кроличьей норы. Это возможно, но обычно это гораздо сложнее, чем использовать более ООП способ решения этой проблемы, чем лямбда-функции.

1 голос
/ 08 июня 2011

Попробуйте это.

for each(var tool in tools){
  tool.addEventListener(MouseEvent.MOUSE_DOWN, toolFunction )
}

function toolFunction (e:MouseEvent){
  trace(e.currentTarget)
}

После прочтения заголовка вопроса снова, я понял, что вам нужно пользовательское событие или:

for each(var tool in tools){
      tool.addEventListener(MouseEvent.CLICK,
              function(e:MouseEvent){toolFunction (e, "another param")},
              false, 0, true);
    }

    function toolFunction (e:MouseEvent,anotherParam:String){
      trace(e.currentTarget)
      trace(anotherParam) //output "another param"
    }
0 голосов
/ 08 июня 2011

использовать as3 сигналы

http://www.peterelst.com/blog/2010/01/22/as3-signals-the-best-thing-since-sliced-bread/

Это может хорошо удовлетворить вашу проблему. После того, как я попробовал сигнал, я не могу вернуться. Это намного лучше, чем система событий в as3

0 голосов
/ 08 июня 2011

Вы не можете вкладывать функции в циклы. Параметры для вызова функции будут иметь одинаковое значение на всех итерациях цикла, и это значение будет получено из последней итерации. Есть некоторые способы, чтобы справиться с этим, но это не очень хорошая практика кодирования, и в будущем это будет сложно изменить.

Вам нужно больше стиля ООП.

Поскольку класс Tool, очевидно, является пользовательским, необходимо изменить его, чтобы он содержал значения или любые ссылки, о которых вы говорили в будущем.
По сути, если у вас есть значение, которое вам нужно передать и связанное с этим объектом, просто сделайте это значение атрибутом класса Tool.

0 голосов
/ 08 июня 2011

попробуйте сделать:

for each(var tool in tools){
var t = tool;
t.addEventListener(MouseEvent.MOUSE_DOWN, function(){
    trace(t); //Always the last tool  
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...