проверка существования ребенка - PullRequest
3 голосов
/ 04 января 2011

Здравствуйте, у меня есть следующая функция:

private function seatClickHandler(e:MouseEvent):void{

            var check:Check = new Check();
            if(e.target.contains(check)){
                e.target.removeChild(seat);
            }else{
                e.target.addChild(check);
            }
        }

В основном я хочу проверить, содержит ли e.target дочерний элемент, называемый check. Если это так, я хочу, чтобы e.target удалил дочерний элемент, иначе я хочу добавить дочерний. Но метод, который я попробовал, кажется, не работает, хотя я думаю, что это путь. Есть предложения?

Ответы [ 4 ]

2 голосов
/ 04 января 2011

Когда вы объявляете свой объект Check, Actionscript создает код ссылки для этого конкретного объекта.

Таким образом, при первом запуске кода вашему объекту Check может быть присвоена ссылка @c0ecc29. Ваш оператор if проверяет, является ли @c0ecc29 дочерним компонентом target. Этого не будет, поэтому объект Check со ссылкой @c0ecc29 добавляется к target.

Во второй раз, когда вызывается clickHandler, создается новый экземпляр объекта Check, который будет иметь новый идентификатор ссылки. У вашей цели есть исходный объект Check со ссылкой @c0ecc29, поэтому он не будет удален.

Правильный способ получить эту работу зависит от того, какая цель (DataGrid, Group и т. Д.).

EDIT: Исходя из ваших комментариев, я бы попробовал что-то подобное. Он проверяет, является ли объект Check дочерним по отношению к target, и добавляет его при необходимости. Затем, если щелкнуть объект Check, он переключит свою видимость.

public var check:Check = new Check();

private function seatClickHandler(e:MouseEvent):void
{
  if(!e.target.contains(check))
  {
    check.addEventListener(MouseEvent.CLICK, check_handleClick);
    e.target.addChild(check);
  }
}

protected function check_handleClick(event:MouseEvent):void
{
  check.visible = !check.visible;
}

Если вам нужно фактически удалить объект Check из target вместо того, чтобы просто изменить его видимость, вы можете попробовать это:

public var check:Check = new Check();

private function seatClickHandler(e:MouseEvent):void
{
  if(!e.target.contains(check))
  {
    e.target.addChild(check);
  }
  else
  {
    e.target.removeChild(check);
  }
}
0 голосов
/ 16 сентября 2011

Это прекрасно сработало для меня в моей ситуации:

if(possibleChild.parent == holder)
    holder.removeChild(possibleChild)

Это может или не может быть именно то, что вы ищете.

0 голосов
/ 04 января 2011

check - это новый объект в области действия этой функции, поэтому он не будет дочерним для цели события.

То, что вы хотите сделать, это объявить check как глобальную переменную (а также привести цель как DisplayObjectContainer).

, например

private function seatClickHandler(e:MouseEvent):void{
                if((e.target as DisplayObjectContainer).contains(check)){
                    (e.target as DisplayObjectContainer).removeChild(seat);
                }else{
                    (e.target as DisplayObjectContainer).addChild(check);
                }
    }

Однако я не уверен, что это именно то, что вы хотите сделать (проверка может быть только одна). Лучшим подходом было бы иметь функцию (возможно, toggleCheck) на цели и иметь этот экранный объект, отвечающий за рендеринг чека (и его удаление)

0 голосов
/ 04 января 2011

Если ребенка зовут 'check', тогда вы сможете использовать getChildByName(). См. flash.display.DisplayObject.name

Если у вас в памяти есть ребенок, вы можете использовать getChildIndex()

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