2010-06-24 6 views
2

내가 가지고있는 정적 속성을 가진 클래스가 이미지로 사용됩니다. 런타임에 이미지를 구성 할 수 있지만 기본값은 그대로 유지하고 싶습니다. 정적이 변경됩니다 버튼을 클릭Actionscript의 데이터 바인딩

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      minWidth="955" 
      minHeight="600" 
      xmlns:ns1="*"> 
<fx:Script> 
    <![CDATA[ 
     [Embed(source="/assets/Yellow-Light.gif")] 
     [Bindable] 
     public var YellowLight:Class; 
    ]]> 
</fx:Script> 
<mx:Image source="{Images.GreenLight}"/> 
<s:Button x="10" 
      y="40" 
      label="Button" 
      click="Images.GreenLight=YellowLight"/> 
<ns1:MyComp x="40" y="0"/> 
</s:Application> 

: 내가이 같은 응용 프로그램을 만드는 경우 이제

package { 
import mx.binding.utils.BindingUtils; 
import mx.controls.Image; 

import spark.components.HGroup; 

public class MyComp extends HGroup { 
    private var _image:Image; 

    public function MyComp() { 
     _image = new Image(); 
     _image.source = Images.GreenLight; 
     addElement(_image); 
     BindingUtils.bindSetter(setImageIcon, Images, "GreenLight"); 
    } 

    private function setImageIcon(newIcon:Class):void { 
     trace(newIcon); 
     _image.source = newIcon; 
    } 
} 
} 

: 지금

package { 
public class Images { 

[Embed(source="/assets/Green-Light.gif")] 
[Bindable] 
public static var GreenLight:Class; 
} 
} 

그리고 사용자 정의 구성 요소를 : 그래서 이미지 클래스처럼 보인다 속성을 Images 클래스에 추가합니다. MXML로 정의되고있는 이미지는 바인딩 이벤트를 취득 해 이미지를 갱신 합니다만, ActionSctipt로 작성된 커스텀 컴퍼넌트는 갱신되지 않습니다.

내 질문은 왜입니까? 어떻게 수정해야합니까?

감사합니다.

답변

1

생성 된 코드의 모습을 보면 AS가 어떻게 작동하는지 알아 내려하지 않아도됩니다.

package { 

public class Images { 
    private static var _self:Images; 
    public static function getInstance():Images { 
     if(_self == null) { 
      _self = new Images(); 
     } 
     return _self; 
    } 
    [Embed(source="/assets/Green-Light.gif")] 
    [Bindable] 
    public var GreenLight:Class; 
} 
} 

그리고으로 mycomp 클래스는 같은 바인딩 할 것입니다 : 맥심에

BindingUtils.bindSetter(setImageIcon, Images.getInstance(), "GreenLight"); 

감사를 들어이 경우 가장 좋은 (쉬운) 옵션은이 같은 싱글로 이미지 클래스를 설정하는 것입니다 조언.

1

static 변수는 특수 마법을 사용하여 EventDispatcher -s 및 StaticPropertyWatcher으로 생성됩니다. 이것에 깊숙이 들어가려면 -keep 컴파일러 옵션을 추가하십시오.

그래서 BindingUtils.bindSetter이 작동하지 않습니다.

bindind 클래스를 사용하여이 문제를 해결하는 방법을 정말로 알고 싶지 않으신가요? Image 인스턴스에 바인딩하는 것이 훨씬 쉽습니다.

+0

그건 내가 생각했던 것인데, 왜 MXML에서 작동할까요? – Ryan

+0

답변을 편집했습니다. 질문에 감사드립니다. –

+0

내가 정적으로하고 싶었던 이유는 런타임에 이미지가 변경 될 수 있고 변경 사항이 애플리케이션의 모든 부분에 반영 될 수 있기 때문입니다. 그래서 솔루션은 그것을 싱글 톤으로 만드는 것입니다. – Ryan