2008-10-16 11 views
2

Actionscript에 CircleButton 클래스가 있습니다. 누군가가 외부에서 'on'속성을 변경했을 때를 알고 싶습니다. 'onChange'를 듣고 있지만 그 이벤트 핸들러를 절대 안타 봅니다.Actionscript 구성 요소가 자체의 propertyChange 이벤트를 수신 할 수 있습니까?

은 내가이 (가) GET/세터 재산 '에'쓸 수 있습니다 알고 있지만 난 그냥 객체가 자신의 이벤트를 수신 할 수 없습니다 [바인딩]

를 사용의 단순함을 좋아한다?

public class CircleButton extends UIComponent 

{ 
    [Bindable] 
    public var on:Boolean; 

    public function CircleButton() 
    { 
     this.width = 20; 
     this.height = 20; 

     graphics.beginFill(0xff6600, 1); 
     graphics.drawCircle(width/2, height/2, width/2); 
     graphics.endFill(); 

     this.addEventListener(MouseEvent.ROLL_OVER, rollover); 
     this.addEventListener(MouseEvent.ROLL_OUT, rollout);   

     this.addEventListener('onChange', onOnChange); 
    }  

    private function onOnChange(event:PropertyChangeEvent):void { 

답변

7

이벤트 유형을 지정하지 않고 [Bindable] 태그를 사용하면 속성의 값이 변경되면 PropertyChangeEvent.PROPERTY_CHANGE 유형의 이벤트 인 'propertyChange'가 전달됩니다.

this.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onOnChange); 

리스너 함수가 호출되지 않았습니다 이유는 이벤트 유형이 정확하지 않았다이다 :

따라서, 그 이벤트를 수신 등록 할 수 있도록, 당신은 말할 필요.

리스너 메소드는 클래스에서 Bindable로 표시된 변수 중 하나라도 변경되면 호출된다는 점에 유의하십시오. 이 이벤트에는 변경된 변수를 나타내는 'property'라는 속성이 있습니다.이 속성이 예 (변화하고 있음을 고려할 때 수동으로 이벤트를

[Bindable(event="myOnChangeEvent")] 

및 파견 :

각 바인딩 변수에서 호출되지 않도록하려면 [바인딩] 태그에서 이벤트를 지정할 필요가에서 세터), 당신이하고 싶지 않은 것 같았습니다.

+0

메소드 호출 앞에서'this' 참조가 필요 없습니다. –

+2

당신은 그렇지 않지만, 청취자를 추가하는 사람을 명확히하기 위해 추가되었습니다. – Laura

1

당신은 예는 here을 발견()

BindingUtils.bindSetter를 사용할 수 있습니다.

1

뭔가가 변수에 바인딩 될 수 있기 때문에 변수에 바인딩 된 것이 없음을 의미하지는 않습니다. 이벤트 시스템과 약간 비슷합니다. 이벤트를 전달할 수있는 것이 무엇이든 듣는 것은 아닙니다.

Flex 바인딩이 기반으로하는 클래스는 BindingUtils 및 ChangeWatcher입니다. MXML (컴파일러에 의해 AS3으로 변환 됨)에서 직접 바인드하면 장면 뒤에있는 클래스를 사용하여 실제로 바인딩을 설정합니다. 이전에 ChangeWatcher를 둘러 보았는데 잠재적으로 바인딩 가능한 항목의 목록을 살펴볼 때 일부 객체가 실제로 리스너로 나열되는 경우에만 디스패치합니다. 전체 바인딩 시스템은 실제로 이벤트 시스템을 둘러싼 스마트 래퍼입니다.

MXML 대신 AS3에서의 바인딩의 의미가 다릅니다. MXML에서 작동하는 미묘한 차이점 (예 : 객체의 하위 속성에 연결)은 AS3에서 동작을 복제해야합니다 (아마도 MXML과 AS3 사이의 코드 생성 결과).

AS 코드의 ChangeWatcher에 대한 약간의 정보는 Adobe doc을보십시오.

개인적으로 - 나는 그것이 서툴러서 MXML 외부의 바인딩을 사용하지 않습니다. 나는 당신이 setter 함수를 쓰는 것을 제안 할 것이다. 왜냐하면 그것은 더 예측 가능하기 때문이다. 또한 ChangeWatcher 및 BindingUtils의 소스 코드를 읽는 것이 좋습니다. 이것은 분명히 읽을 가능성이 가장 높은 AS3 중 일부입니다.

1

내가 가장 좋아하는 접근 방식 중 하나는 here 인 Observe 클래스입니다. 그것은 본질적으로 setter를 사용하지만 좋은 반복 접근법입니다.