[Flex 3] ComboBox bug ?

Dropdown của combo box không tự động “re-draw” khi dataProvider của combobox thay đổi ? Chưa thể khẳng định đây là một bug của Flex 3.x, nhưng điều này gây nên sự khó hiểu khi làm việc với combobox của Flex 3.x. Trong ví dụ dưới đây có 2 combobox, tạm thời gọi một cái là source combo và cái còn lại là target combo. Khi dữ liệu ở source combo thay đổi thì target combo sẽ thay đổi theo.

<mx:WindowedApplication name="Screen_screens_test"
        xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical" verticalAlign="middle"
	horizontalScrollPolicy="off" verticalScrollPolicy="off">
    <mx:Script>
        <![CDATA[
			import mx.collections.ArrayCollection;
			import flash.events.Event;

			[Bindable]
			public var targetDP: ArrayCollection;

			public function comboChangeHandler(e:Event): void {
				switch (sourceCombo.selectedIndex) {
					case 0:
						targetDP = new ArrayCollection( [ { label:"A1", data:"A1" }, { label:"A2", data:"A2" }, { label:"A3", data:"A3" } ]);
					break;

					case 1:
						targetDP = new ArrayCollection( [ { label:"B2", data:"B1" }, { label:"B2", data:"B2" }, { label:"B3", data:"B3" } ]);
					break;

					case 2:
						targetDP = new ArrayCollection( [ { label:"C3", data:"C1" }, { label:"C2", data:"A2" }, { label:"C3", data:"C3" } ]);
					break;

					case 3:
						targetDP = new ArrayCollection( [ { label:"D4", data:"D1" }, { label:"D2", data:"A2" }, { label:"D3", data:"D3" } ]);
					break;

					default:
					break;
				}
				targetCombo.dataProvider = targetDP;
			}
        ]]>
    </mx:Script>
	<mx:HBox width="100%">
		<mx:ComboBox id="sourceCombo" change="{comboChangeHandler(event)}">
			<mx:ArrayCollection>
				<mx:Array id="myArray">
					<mx:Object label="A Classes" data="a"/>
					<mx:Object label="B Classes" data="b"/>
					<mx:Object label="C Classes" data="c"/>
					<mx:Object label="D Classes" data="d"/>
				</mx:Array>
			</mx:ArrayCollection>
		</mx:ComboBox>
		<mx:ComboBox id="targetCombo" />
	</mx:HBox>
</mx:WindowedApplication>

Tuy nhiên khi thi hành đoạn code trên,  text ở target combo thay đổi, nhưng nội dung dropdown list của nó thì không. Có vẻ Flex xem dropdown là một component không phụ thuộc vào combobox😐.

Việc fix bug này thực ra khá đơn giản, bạn có thể viết 1 class extend lại từ mx.controls.ComboBox và override phương thức getter/setter dataProvider

[Bindable]
override public function get dataProvider():Object {
	return super.dataProvider;
}

[Bindable]
override public function set dataProvider(ac:Object):void {
	super.dataProvider = ac;
	if (this.dropdown) {
		this.dropdown.dataProvider = ac;
	}
}

Cách khác là tìm cách gán lại dataProvider cho dropdown. Như ví dụ ban đầu, chỉ cần thêm

targetCombo.dropdown.dataProvider = targetDP;

phía dưới

targetCombo.dataProvider = targetDP;

One thought on “[Flex 3] ComboBox bug ?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s