2009-08-24 38 views
1

我在創建Flex應用程序時遇到了問題。我相信問題在於我對組件生命週期的理解不夠,我將不勝感激一些指針!組件創建問題

我的應用程序在Air中運行。該應用程序創建一個DashItems數組。 DashItem是擴展Canvas的ActionScript類。根據創建DashItem時傳遞的數據,將不同的組件添加到此畫布中。例如,如果dashtype是「網格」,則創建一個EvGrid。 EvGrid是一個基於DataGrid的mxml組件。 DashItem設置url並在EvGrid中調用一個啓動HTTPService send()的公共函數。數據被檢索並顯示在網格中。這是按預期工作的。

這是棘手的部分。我希望做一個滾動顯示這些DashItems(想想Snackr)。所以我在主應用程序中爲Event.ENTER_FRAME設置了一個eventlistener。被調用的函數將項目向上滾動並在滾動頂部時回收它們。當我在創建DashItems數組後立即創建這個eventListener時,什麼都不顯示。調試我看到DashItems中的組件接收來自HTTPService的數據,我看到我的滾動代碼調整了y設置,但是在應用程序窗口中沒有看到任何東西。

當我通過設置另一個計時器,在完成時設置ENTER_FRAME事件處理程序,延遲添加event_istener爲ENTER_FRAME時,項目出現。有時,如果dataService返回緩慢,但是,我得到一個空的網格。網格數據提供者是Bindable。

這使我相信我正在踐踏組件生命週期的某個部分。我會在下面放置一些代碼片段。感謝您對這位新手的任何幫助或建議。

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

滾輪的的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
  1. 呼叫的setTimeout(startAnimation,1000)。可能比創建計時器更容易。或者使用UIComponents上的「callLater」函數。

  2. 在相同的說明...你可以使用setInterval(func,33)代替ENTER_FRAME(假設aprox 30幀/秒)。

  3. 爲了找到某個項目準備就緒時,請監聽FlexEvent.CREATION_COMPLETE事件。

+0

感謝您的提示。我會給他們一個嘗試。 – Todd 2009-08-25 15:15:58

1

我相信這個問題是我可憐的 理解組件 生命週期的,我會大大 欣賞一些指針

Excellent white paper on the Flex Component Lifecycle.雖然不是專門針對您的問題,如果你喜歡你需要一些生命週期知識,這將涵蓋你。

+0

感謝鏈接,我會檢查出來。 – Todd 2009-08-25 15:15:15