4

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

4

3 に答える 3

2

itemRenders の Peter Ent によるシリーズへの更新されたリンク

于 2009-08-25T18:35:50.427 に答える
1

itemRenderer が正しく実装されていません。これが問題の原因である可能性があります

オーバーライドされた set data メソッドは、super.data = value を設定する必要があります。Flex Containers は IDataRenderer を実装し、既に持っているため、独自の _data プロパティを実装する必要はありません。コードを実行しなくても、キャッシュ/リサイクルの問題が発生していると思います。

私が一般的に好むのは、[Bindable] プライベート myProperty:Object (通常は EventDispatcher を拡張するカスタム MyObjectVO) を作成することです。次に、set data メソッドで、super.data = valueに続いてif(value!=null) myProperty=valueを設定します。

これにより、実際のデータを厳密に型指定し、Canvas (または他のコンテナー) によって実装された IDataRenderer インターフェイスに関してメカニズムをそのままにして、データが適切にリサイクルされるようにすることができます。

広告の作成を初期化するComplete は itemRenderer の貧弱なイベントです。これらのイベントは実際にはリサイクルされ、これらのメソッドは期待または希望どおりに動作しないためです。

itemRenders に関する Peter Ent によるこのシリーズが私にとってどれほど有益であったかは言葉では言い尽くせません。

于 2009-04-25T01:16:06.110 に答える
0

まあ、彼は正しいです、私は同じバグを持っています.最初のitemRendererは2回呼び出されます.公式フォーラムで私の投稿を見ることができます.

http://forums.adobe.com/thread/604259

ここでバグが埋められます:

https://bugs.adobe.com/jira/browse/SDK-26010

于 2010-03-25T23:55:10.360 に答える