2014-12-20 5 views
1

배경 : 멋진 (비공개로 문서화되지 않은 경우) AS3SVGRenderer lib를 스쳐 지나가고 있고 이해할 수없는 코드가 있습니다.일부 루프 코드가 DisplayObject 계층 구조를 따라 잡는 것을 이해합니다.

아래 코드는 lib의 Flex 데모에서 가져온 것입니다. "svgGroup"은 스파크 Group이며 eventListener가 첨부되어 있습니다. 클릭하면 클릭 된 SVGElement 인스턴스가 반환됩니다. 나는 이것을 이해하려고 노력 중이므로 SVGElements에 프로그램 방식으로 액세스 할 수 있습니다.

아래 함수는 eventListener에 의해 호출됩니다. arg로 클릭 된 DisplayObject을 수신합니다.

SVGElement를 확장


Sprite
public static function getSVGElement(object:DisplayObject):SVGElement { 
     while(object != null && !(object is SVGElement)){ 
      object = object.parent; 
     } 
     return object as SVGElement; 
    } 

질문 :

나 그것의 독서를 통해 걸어 봅시다.

목적 null이 아니고 객체가 널 OR 객체 따라서 본질적으로는 걸어되는 SVGElement 다음

break out of loop 
    return object 

경우 목적은 SVGElement

set object to its parent 

아니지만 컨테이너가 SVGElement 인스턴스를 찾을 때까지 컨테이너. 나는 그 권리가 있니? 이 같은 뭔가 :

SVGElement <-DisplayObject <-DisplayObject


protected function svgGroup_clickHandler(e:MouseEvent):void { 
     selectedElement = DisplayUtils.getSVGElement(e.target as DisplayObject); 
    } 

답변

1

예, 맞습니다. getSVGElement 기능은 다음과 같이 재귀 적으로 다시 작성할 수 있습니다 : 좀 더 이해할 수 있습니다

public static function getSVGElement(object:DisplayObject):SVGElement { 
    if (object == null || object is SVGElement) { 
     return object as SVGElement; 
    } else { 
     return getSVGElement(object.parent); 
    } 
} 

다소 덜 효율적 또한 경우.

+0

감사합니다. 나는 당신의 버전을 쉽게 이해했다. 나는 NOT (IS 객체) 구조 ('! (object is SVGElement))가 내 두뇌를 파괴하고 있다고 생각한다. –