Как я могу предотвратить создание экземпляра / добавления / инициализации / etc в первой строке itemRenderer сетки данных? - PullRequest
4 голосов
/ 14 марта 2009

В первой строке Flex DataGrid itemRenderer будет инициализирован дважды. Трассировка результатов показывает, что гибкая структура, возможно, создает два экземпляра itemRenderer первой строки. В более сложном приложении, где itemRenderer содержит привязанный к данным ColorPicker, мы видим бесконечный цикл из-за этой проблемы. Только itemRenderer первой строки инициализируется дважды. Есть ли способ переопределить поведение 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 creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput, элемент 1 initialize: event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, null creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, элемент 2 creationComplete: event.target = ItemRenderers0.dg ... SimpleItemRenderer12.textInput, элемент 1

Ответы [ 3 ]

2 голосов
/ 25 августа 2009
1 голос
/ 25 апреля 2009

Ваш itemRenderer не реализован должным образом, и это может быть причиной ваших проблем

Метод переопределенных данных должен устанавливать super.data = значение. Вам не нужно реализовывать собственное свойство _data, поскольку контейнеры Flex реализуют IDataRenderer и уже имеют его. Я думаю, без запуска вашего кода, что вы столкнулись с проблемой с кешем / утилизацией.

Что я обычно предпочитаю делать, так это создавать [Bindable] закрытый myProperty: Object (обычно пользовательский MyObjectVO, расширяющий EventDispatcher). Затем в моем методе set data я установлю super.data = значение , а затем if (value! = Null) myProperty = value .

Это позволяет мне строго вводить фактические данные, не затрагивая механизмы в отношении интерфейса IDataRenderer, реализованного Canvas (или другим контейнером), и обеспечивает правильную переработку данных.

Инициализируйте создание объявлений. Полное - это плохие события в itemRenderers, потому что они фактически перерабатываются, и эти методы не ведут себя так, как можно было бы ожидать или хотеть.

Не могу выразить, насколько полезна эта серия Питера Энта для itemRenders для меня.

0 голосов
/ 26 марта 2010

Ну, он прав, у меня та же ошибка, первый itemRenderer вызывается дважды, мой пост можно посмотреть на официальном форуме здесь:

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

и ошибка заполняется здесь:

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

...