flowerspring


데이터 바인딩식의 소스로서 사용할 수 있는 프롭퍼티를 식별합니다

프로퍼티가 데이터 바인딩식의 소스인 경우, Flex는 소스 프로퍼티의 변경시에 자동적으로 소스 프로퍼티의 값을 행선지 프로퍼티에 카피합니다.
다만, 카피를 실행하는 듯 Flex 에 통지하기 위해서는 [Bindable] 메타데이터태그를 사용해 프로퍼티를 Flex 에 등록해 소스 프로퍼티로부터 이벤트를 송출할 필요가 있습니다.

[Bindable] 메타데이터태그의 문장구조법은 다음과 같습니다.

[Bindable]
[Bindable(event="eventname")]

이벤트명을 생략 하면, Flex는 자동적으로 propertyChange라는 이름의 이벤트를 생성합니다.

데이터 바인딩 및 이 메타데이터태그에 대해 자세한 것은,데이터 바인딩을 참조해 주세요.


바인드 가능 프로퍼티 체인의 사용

데이터 바인딩의 소스로서 프로퍼티를 지정하면 그 프로퍼티의 변경 뿐만이 아니라 그 프로퍼티가 포함되는 프로퍼티 체인도 감시됩니다. 행선지 프로퍼티를 포함한 프로퍼티의 체인 전체는 「바인드 가능 프로퍼티 체인」이라고 불립니다.
다음의 예의 firstName.text는  firstName 오브젝트와 그 text 프로퍼티를 포함한 바인드 가능 프로퍼티 체인입니다.
 <first>{firstName.text}</first>

바인드 가능 프로퍼티 체인내의 지정한 프로퍼티가 변경되었을 경우에는 이벤트를 생성할 필요가 있습니다. 프로퍼티가 [Bindable] 메타데이터태그에 의해서 마크 되고 있는 경우는 Flex 컴파일러에 의해서 자동적으로 이벤트가 생성됩니다.

다음의 예는 변수 및 getter 프로퍼티에 대해서 [Bindable] 메타데이터태그를 사용하고 있습니다. 또한 이 예는 dispatchEvent() 함수를 호출하는 방법도 나타내 보이고 있습니다.

 [Bindable]
public var minFontSize:Number = 5;

[Bindable("textChanged")]
public function get text():String {
    return myText;
}

public function set text(t : String):void {
    myText = t;
    dispatchEvent( new Event( "textChanged" ) );
}

[Bindable] 메타데이터태그로 이벤트명을 생략 했을 경우는 Flex 컴파일러에 의해서 propertyChange라는 이름의 이벤트가 자동적으로 생성되어 송출되기 위해, 프로퍼티를 데이터 바인딩식의 소스로서 사용할 수 있습니다.

또, 오브젝트를 기존의 형태에 캐스트 하는 것에 의해서 오브젝트에 관한 구체적인 정보를 컴파일러에 제공할 필요가 있습니다.
다음의 예에서는,List 컨트롤의 myList 에 Customer 오브젝트가 포함되어 있으므로,selectedItem 프로퍼티는 Customer 오브젝트에 캐스트 됩니다.
 <mx:Model id="selectedCustomer">
    <customer>
        <name>{Customer(myList.selectedItem).name}</name>
        <address>{Customer(myList.selectedItem).address}</address>
        ...
    </customer>
</mx:Model>

경우에 따라서는, 바인딩이 의도한 대로 자동적으로 실행되지 않는 것이 있습니다.
다음의 예 처럼, dataProvider 프로퍼티의 아이템 전체를 변경했을 경우 바인딩은 자동적으로는 실행되지 않습니다.
 dataProvider[i] = newItem

또, 다음의 예 처럼, 프로퍼티의 서브 프로퍼티가 [Bindable] 메타데이터를 가지는 경우도 바인딩은 자동적으로는 실행되지 않습니다.
 ...
[Bindable]
var temp;
// Binding is triggered:
temp = new Object();
// Binding is not triggered, because label not a bindable property
// of Object:
temp.label = foo;
...

이 코드예에서는 {temp.label} 에 관해서 temp 하지만 Object 인 것이 문제입니다. 이 문제는 다음의 몇개의 방법으로 해결할 수 있습니다.
  • Object 의 초기화 사전 처리를 실시합니다.
  • ObjectProxy를 temp 에 할당합니다.ObjectProxy 의 프로퍼티는 모두 바인드 가능합니다.
  • temp를, 바인드 가능한 label 프로퍼티를 사용하고, 엄밀하게 형태 지정된 오브젝트로 합니다.
mouseX 프로퍼티 등 Flash Player 에 의해서 자동적으로 갱신되는 프로퍼티에 데이터를 바인딩 하는 경우에도 바인딩은 자동적으로는 실행되지 않습니다.

UIComponent 클래스의 executeBindings() 메소드는 UIComponent 오브젝트를 행선지로 하는 모든 바인딩을 실행합니다.Repeater 컴퍼넌트를 포함한 모든 컨테이너 및 컨트롤은 UIComponent 클래스를 확장한 것입니다. Container 클래스 및 Repeater 클래스의 executeChildBindings() 메소드는 Container 클래스 또는 Repeater 클래스의 아이 UIComponent 컴퍼넌트를 행선지로 하는 모든 바인딩을 실행합니다. 컨테이너는 모두 Container 클래스를 확장한 것입니다.

이러한 메소드에 의해 의도한 대로 행해지지 않는 바인딩을 실행할 수 있습니다. 변경을 더해도 바인딩이 실행되지 않는 경우에 유저 인터페이스를 갱신하려면 executeChildBindings() 메소드에의 호출등의 코드를 1 행 추가합니다. 다만 executeBindings() 메소드는 바인딩이 자동적으로 실행되지 않는 것을 알 수 있고 있는 경우에게만 사용합니다. 
 

Comment +0