¿Cómo detengo la instancia de itemRenderer de la primera fila de una cuadrícula de datos de instanciar / agregar / inicializar / etc. dos veces?

StackOverflow https://stackoverflow.com/questions/645323

Pregunta

En la primera fila de una Flex DataGrid, el itemRenderer se inicializará dos veces. El seguimiento de los resultados revela que el marco flexible posiblemente está creando dos instancias del itemRenderer de la primera fila. En una aplicación más compleja, donde itemRenderer contiene un ColorPicker vinculado a datos, estamos viendo un bucle infinito debido a este problema. Solo el itemRenderer de la primera fila se inicializa dos veces. ¿Hay alguna forma de anular el comportamiento de flex y evitar que esto ocurra? El siguiente código demuestra el problema:

Aplicación principal:

<?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>

Salida abreviada:

initialize: event.target = ItemRenderers0.dg ... SimpleItemRenderer12.textInput, nulo initialize: event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput, nulo creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput, elemento 1 initialize: event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, nulo creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, elemento 2 creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer12.textInput, elemento 1

¿Fue útil?

Solución

Su itemRenderer no está realmente implementado correctamente, y esta podría ser la causa de sus problemas

El método de datos de conjunto anulado debe establecer super.data = value. No necesita implementar su propia propiedad _data, ya que los Contenedores Flex implementan IDataRenderer y ya lo tienen. Creo, sin ejecutar su código, que está teniendo un problema con el caché / reciclaje.

Lo que generalmente prefiero hacer es crear un [Bindable] privado myProperty: Object (generalmente un MyObjectVO personalizado que extiende EventDispatcher). Luego, en mi método de establecer datos, estableceré super.data = value seguido de if (value! = Null) myProperty = value .

Esto me permite escribir fuertemente mis datos reales, dejar intactos los mecanismos con respecto a la interfaz IDataRenderer implementada por el Canvas (u otro contenedor) y asegura que los datos se reciclan correctamente.

Inicialice la creación de anuncios Los completes son malos en los ItemRenderers porque en realidad se reciclan y estos métodos no se comportan como uno podría esperar o desear.

No puedo expresar cuán beneficiosa esta serie de Peter Ent en itemRenders fue para mí.

Otros consejos

Bueno, tiene razón, tengo el mismo error, el primer itemRenderer se llama dos veces, puedes ver mi publicación en el foro oficial aquí:

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

y se llena un error aquí:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top