В ActionScript 3.0, если событие отправляется членом объекта, как я могу получить доступ к объекту, содержащему этот член? - PullRequest
1 голос
/ 22 июня 2010

Я пытаюсь настроить меню.Поскольку в этом меню может быть различное количество записей, я создаю его вместо жесткого его кодирования.Объект Menu содержит массив объектов MenuEntry, и у каждого MenuEntry есть объект framework.Button, который содержит текст и поле, которое фактически отображается на экране.Я могу добавить событие MouseEvent.Click для Button, но не для MenuEntry.Однако, если я сделаю это таким образом, я не смогу получить доступ к данным в объекте MenuEntry, который содержит кнопку, поэтому я не знаю, какой MenuEntry был нажат.

Единственное решение, которое я могу придуматьвключает в себя проверку положения мыши по отношению к положению каждого элемента меню, в зависимости от количества записей меню.Это не похоже на правильный способ сделать это, так как это не масштабируется.Я пытался, чтобы класс MenuEntry расширял класс Button, поэтому теоретически сам MenuEntry мог отправлять события щелчка мышью, но это не сработало.

1 Ответ

3 голосов
/ 22 июня 2010

В случае, если MenuEntry объекты не являются отображаемыми объектами, вы можете выполнить итерацию по массиву MenuEntry и сравнить, если кнопка совпадает с e.currentTarget, чтобы найти MenuEntry, который был нажат.

button.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent):void
{
  var t:DisplayObject = DisplayObject(e.currentTarget);
  var menuEntry:MenuEntry;
  for(var i:Number = 0; i < menuEntries.length; i++)
  {
    if(menuEntries[i].button == t)
    {
      menuEntry = t;
      break;
    }
  }
  trace(menuEntry);
}

Если элементы MenuEntry действительно являются отображаемыми объектами, вы можете получить ссылку на них из свойства parent кнопки

box.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent):void
{
  var t:DisplayObject = DisplayObject(e.currentTarget);
  trace(t);//traces box
  trace(t.parent);/* traces box's parent which can be 
                     the same as root if box is added
                     as child to the root */
  trace(t.root);//traces the root 
  traceParents(t);
}

traceParents(t:DisplayObject):void
{
  var p:DisplayObjectContainer = t.parent;
  while(p != null)
  {
    trace(p);
    p = p.parent;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...