2009-08-24 5 views
1

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

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

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

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

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

Scroller.mxml в тх: раздел Script

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); 
      } 

HTTPService скроллер в:

<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 

>

ответ

0

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

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

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

+0

Спасибо за ссылку! – Todd

0
  1. Вызов SetTimeout (startAnimation, 1000). Наверное, проще создать таймер. Или просто используйте функцию «callLater» на UIComponents.

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

  3. Для поиска, когда объект готов, прислушайтесь к событию FlexEvent.CREATION_COMPLETE.

+0

Спасибо за советы. Я попробую их попробовать. – Todd

1

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

Excellent white paper on the Flex Component Lifecycle. Хотя конкретно не обращаясь ваш вопрос, если вы чувствуете, как вам нужно знать знания жизненного цикла, которые вы охватите.

+0

Спасибо за ссылку, я проверю ее. – Todd

Смежные вопросы