Flex DataGridの最初の行では、itemRendererが2回初期化されます。結果をトレースすると、フレックスフレームワークが最初の行のitemRendererの2つのインスタンスを作成している可能性があることがわかります。itemRendererにデータバインドされたColorPickerが含まれている、より複雑なアプリケーションでは、この問題が原因で無限ループが発生します。最初の行のitemRendererのみが2回初期化されます。flexの動作をオーバーライドして、これが発生しないようにする方法はありますか?次のコードは問題を示しています。
主な用途:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="on_initialize(event);">
<mx:Script>
<![CDATA[
/**
* This experiment shows how the first row's itemrenderer is instantiated/added/initialized twice.
* We've never even noticed this before we found that a data-bound ColorPicker enters a infinite
* loop when it is within an itemRenderer.
*/
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
private var dg_array:Array;
private var dg_arrayCollection:ArrayCollection;
private function on_initialize(event:FlexEvent):void {
dg_array = new Array();
dg_arrayCollection = new ArrayCollection();
dg_arrayCollection.addItem("item 1");
dg_arrayCollection.addItem("item 2");
dg.dataProvider = dg_arrayCollection;
}
]]>
</mx:Script>
<mx:DataGrid id="dg" width="100%" height="100%" rowCount="5">
<mx:columns>
<mx:DataGridColumn headerText="Name" itemRenderer="SimpleItemRenderer"/>
</mx:columns>
</mx:DataGrid>
</mx:Application>
SimpleItemRenderer:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="//on_initialize(event);">
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
[Bindable]
override public function set data(value:Object):void { _data = value; }
override public function get data():Object { return _data; }
private var _data:Object;
private function on_initialize_textInput(event:FlexEvent):void {
trace("initialize:event.target="+event.target+", " + _data); // runs twice, for the first item only
}
private function on_creationComplete_textInput(event:FlexEvent):void {
trace("creationComplete:event.target="+event.target+", " + _data); // runs twice, for the first item only
}
]]>
</mx:Script>
<mx:TextInput text="{data}" id="textInput" initialize="on_initialize_textInput(event);" creationComplete="on_creationComplete_textInput(event);"/>
</mx:Canvas>
省略された出力:
initialize:event.target = ItemRenderers0.dg ... SimpleItemRenderer12.textInput、null initialize:event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput、null createdComplete:event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput、アイテム1initialize:event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput、null CreationComplete:event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput、アイテム2creationComplete:event.target = ItemRenderers0.dg ... SimpleItemRenderer12 .textInput、アイテム1