2009-08-24 6 views
1

Ich habe Probleme mit einer Flex-App, die ich erstelle. Ich glaube, das Problem liegt in meinem schlechten Verständnis des Komponentenlebenszyklus und ich würde einige Hinweise sehr schätzen!Problem mit der Komponentenerstellung

Meine App läuft in der Luft. Die Anwendung erstellt ein Array von DashItems. Ein DashItem ist eine ActionScript-Klasse, die Canvas erweitert. Basierend auf Daten, die beim Erstellen des DashItem übergeben wurden, werden verschiedene Komponenten zu diesem Canvas hinzugefügt. Wenn z. B. das Kürzel "grid" ist, wird ein EvGrid erstellt. EvGrid ist eine auf DataGrid basierende mxml-Komponente. Das DashItem legt die URL fest und ruft eine öffentliche Funktion in EvGrid auf, die den HTTPService send() initiiert. Daten werden abgerufen und im Raster angezeigt. Dies funktioniert wie erwartet.

Hier ist der knifflige Teil. Ich möchte diese DashItems scrollen (denke Snackr). Also habe ich in der Hauptanwendung einen Eventlistener für Event.ENTER_FRAME eingerichtet. Die Funktion, die aufgerufen wird, scrollt die Elemente auf dem Bildschirm und recycelt sie, wenn sie von oben nach unten scrollen. Wenn ich diesen EventListener direkt nach dem Erstellen meines Arrays von DashItems erstelle, wird nichts angezeigt. Debuggen Ich sehe die Komponenten in den DashItems, die ihre Daten vom HTTPService erhalten, und ich sehe, wie mein Scroll-Code die Y-Einstellungen anpasst, aber im Anwendungsfenster ist nichts zu sehen.

Wenn ich das Hinzufügen des eventListener für ENTER_FRAME verzögert, indem Sie einen weiteren Zeitgeber festlegen, der nach Abschluss den Ereignishandler ENTER_FRAME aktiviert, werden die Elemente angezeigt. Wenn der dataService langsam zurückkehrt, erhalte ich manchmal ein leeres Raster. Der Grid-Datenprovider ist bindbar.

Dies führt zu der Annahme, dass ich einen Teil des Lebenszyklus der Komponenten trample. Ich werde unten einige Code-Snippets einfügen. Danke für jegliche Hilfe oder Ratschläge für diesen Anfänger.

Scroller.mxml in mx: Script Abschnitt

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

Auswahlrad der Http:

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

DashItem.as Snippet

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 Schnipsel:

<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 

>

Antwort

0
  1. Anruf setTimeout (startAnimation, 1000). Wahrscheinlich einfacher als einen Timer zu erstellen. Oder verwenden Sie einfach die "CallLater" -Funktion auf UIComponents.

  2. Auf die gleiche Note ... können Sie setInterval (func, 33) anstelle von ENTER_FRAME (unter Annahme von ca. 30 Frames/s) verwenden.

  3. Suchen Sie nach dem FlexEvent.CREATION_COMPLETE-Ereignis, um zu ermitteln, wann ein Element bereit ist.

+0

Danke für die Tipps. Ich werde es versuchen. – Todd

1

Ich glaube, das Problem mit meinem armen ist Verständnis der Komponente Lebenszyklus und ich würde sehr schätzen einige Hinweise

Excellent white paper on the Flex Component Lifecycle. Obwohl nicht speziell auf Ihre Frage Adressierung, wenn Sie Lust haben Sie wollen etwas Lebenszyklus-Wissen, das Sie abgedeckt haben.

+0

Danke für den Link, ich werde es überprüfen. – Todd