Проблема с созданием компонента - PullRequest
1 голос
/ 25 августа 2009

У меня проблемы с создаваемым приложением Flex. Я считаю, что проблема в том, что я плохо понимаю жизненный цикл компонента, и я был бы очень признателен за некоторые советы!

Мое приложение работает в эфире. Приложение создает массив DashItems. DashItem - это класс ActionScript, расширяющий Canvas. На основании данных, переданных при создании DashItem, на этот холст добавляются различные компоненты. Например, если dashtype «grid», создается EvGrid. EvGrid - это mxml-компонент, основанный на DataGrid. DashItem устанавливает URL-адрес и вызывает открытую функцию в EvGrid, которая инициирует HTTPService send (). Данные извлекаются и отображаются в сетке. Это работает, как и ожидалось.

Вот сложная часть. Я хочу сделать скроллинг этих DashItems (думаю, Snackr). Поэтому я установил список событий для Event.ENTER_FRAME с помощью основного приложения. Вызываемая функция прокручивает элементы вверх по экрану и перерабатывает их, когда они прокручиваются сверху. Когда я создаю этот eventListener сразу после создания моего массива DashItems, ничего не отображается. Отладка Я вижу компоненты в DashItems, получающие свои данные от HTTPService, и я вижу, что мой код прокрутки корректирует настройки y, но в окне приложения ничего не видно.

Когда я откладываю добавление eventListener для ENTER_FRAME, устанавливая другой таймер, который после завершения устанавливает обработчик события ENTER_FRAME, появляются элементы. Иногда, если dataService медленно возвращается, я получаю пустую сетку. Поставщик данных сетки является привязываемым.

Это наводит меня на мысль, что я попираю некоторую часть жизненного цикла компонента. Я помещу некоторые фрагменты кода ниже. Спасибо за любую помощь или совет этому новичку.

Scroller.mxml в разделе mx: сценарий

public function handleApplicationComplete(event:Event):void {
                dataService.send();
            }
            public function faultHandler(event:FaultEvent): void {
                trace(event.toString());
            }

            public function resultHandler(event:ResultEvent): void {
                trace("returned XML: " + event.result.toString());
                for each (var i:XML in event.result.item) {
                    var dx:DashItem = new DashItem({
                                        type:   i.type,
                                        url:    i.url.toString(),
                                        index:  i.index,
                                        title:  i.title,
                                        description: i.description,
                                        height: this.height/(DISPLAY_LIST_SIZE -1),
                                        width:  this.width * 0.9
                                    });

                    trace("created " + dx.toString());
                    DashList.unshift(dx);
                }
                buildDisplayList();
                var timer:Timer = new Timer(1000, 1);
                timer.addEventListener(TimerEvent.TIMER_COMPLETE, startAnimation);
                timer.start();
            }

            private function startAnimation(event:TimerEvent):void {
                trace("starting animation");
                addEventListener(Event.ENTER_FRAME, animate);   
            }

            private function buildDisplayList():void {
                var starty:Number = this.height;
                var listSize:Number = DISPLAY_LIST_SIZE;
                if ( DashList.length < DISPLAY_LIST_SIZE) {
                    listSize = DashList.length;
                }
                for (var i:Number = 0; i < listSize; i++) {
                    var di:DashItem = DashList.pop();
                    displayList.unshift(di);
                    di.y = starty;
                    scroller.addChild(di);
                    starty += di.height + PADDING;
                }
                trace("DisplayList is: ");
                traceList(displayList);
            }

Сервис HTTPS скроллера:

<mx:HTTPService
        id="dataService"
        url="{DS_URL}"
        resultFormat="e4x"
        fault="faultHandler(event);"
        result="resultHandler(event);" />

Фрагмент DashItem.as

public function build():void {
            if (type == "grid") {
                trace("Building EventList...");
                var ev:EvGrid = new EvGrid();
                ev.evtitle = this.title;
                this.addChild(ev);
                ev.fetchData();
            } else if (type == "StatChart") {

Фрагменты EvGrid:

<mx:HTTPService 
        id="dataService"
        url="{ws}"
        resultFormat="e4x"
        result="resultsHandler(event);"
        fault="faultHandler(event);"
    />  

    <mx:XMLListCollection id="eventListXml" source="{xmlData.events.event}"/>
    <mx:Panel id="evwrapper" title="{evtitle}" width="100%" height="100%">

    <components:RowColorDataGrid id="EventListGrid"
            dataProvider="{eventListXml}"
            width="100%"
            height="100%"
            rowCount="{eventListXml.length+1}"
            rowColorFunction="calcRowColor">
            <components:columns>
                <mx:DataGridColumn 
                    id="Serial"
                    dataField="serial"
                    headerText="Serial"
                    width="70"

                />
                <mx:DataGridColumn 
                    id="Severity"
                    dataField="severity"
                    headerText="Severity"
                    width="60"
                />
                <mx:DataGridColumn
                    id="snlStatus"
                    dataField="snlstatus"
                    headerText="snlStatus"
                    width="100"
                />
                <mx:DataGridColumn
                    id="Owneruid"
                    dataField="owneruid"
                    headerText="Owner"
                    width="70"
                />
                <mx:DataGridColumn
                    id="Node"
                    dataField="node"
                    headerText="Node"
                    width="120"
                />
                <mx:DataGridColumn
                    id="Summary"
                    dataField="summary"
                    headerText="Summary"
                    labelFunction="getCdata"
                />
            </components:columns>
        </components:RowColorDataGrid>

    </mx:Panel

>

Ответы [ 3 ]

1 голос
/ 25 августа 2009

Я считаю, что проблема в моем бедном понимание компонента жизненный цикл, и я бы очень оцените некоторые указатели

Отличная белая книга о жизненном цикле компонентов Flex. Если вы не решаете конкретно вашу проблему, если вы чувствуете, что хотите получить знания жизненного цикла, это поможет вам.

0 голосов
/ 26 августа 2009

Презентация Deepa на MAX год или два назад - отличный способ лучше понять жизненный цикл компонента Flex:

http://tv.adobe.com/MAX-2008-Develop/Creating-New-Components-in-Flex-3-by-Deepa-Subramaniam.html#vi+f15384v1002

Как только вы поймете схемы аннулирования свойств, размеров и списка отображения, вы сможете сделать огромную сумму.

0 голосов
/ 25 августа 2009
  1. Вызовите setTimeout (startAnimation, 1000). Наверное, проще, чем создать таймер. Или просто используйте функцию callLater для UIComponents.

  2. На той же ноте ... вы можете использовать setInterval (func, 33) вместо ENTER_FRAME (при условии приблизительно 30 кадров / сек)

  3. Чтобы узнать, когда элемент готов, прослушайте событие FlexEvent.CREATION_COMPLETE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...