2009-08-24 5 views
1

Je rencontre des difficultés avec une application Flex que je suis en train de créer. Je crois que le problème est avec ma mauvaise compréhension du cycle de vie des composants et j'apprécierais grandement quelques indications!Problème lors de la création d'un composant

Mon application fonctionne dans Air. L'application crée un tableau de DashItems. Un DashItem est une classe ActionScript qui étend Canvas. Sur la base des données transmises lors de la création de DashItem, différents composants sont ajoutés à ce canevas. Par exemple, si dashtype est "grid", un EvGrid est créé. EvGrid est un composant mxml basé sur DataGrid. Le DashItem définit l'URL et appelle une fonction publique dans EvGrid qui initie le HTTPService send(). Les données sont récupérées et affichées dans la grille. Cela fonctionne comme prévu.

Voici la partie délicate. Je souhaite faire un affichage défilant de ces DashItems (pensez Snackr). J'ai donc mis en place un eventlistener pour Event.ENTER_FRAME avec dans l'application principale. La fonction appelée fait défiler les éléments sur l'écran et les recycle lorsqu'ils défilent en haut. Lorsque je crée ce eventListener immédiatement après avoir créé mon tableau de DashItems, rien n'est affiché. Débogage Je vois les composants dans les DashItems recevoir leurs données du HTTPService, et je vois mon code de défilement ajuster les paramètres y, mais rien n'est vu dans la fenêtre de l'application.

Lorsque je retarde l'ajout de l'événement eventListener pour ENTER_FRAME en définissant un autre temporisateur qui, une fois terminé, définit le gestionnaire d'événements ENTER_FRAME, les éléments apparaissent. Parfois, si le service de données retourne lentement, cependant, j'obtiens une grille vide. Le fournisseur de données de grille est Bindable. Cela m'amène à croire que je piétine une partie du cycle de vie du composant. Je vais placer quelques extraits de code ci-dessous. Merci pour toute aide ou conseil à ce novice.

Scroller.mxml dans mx: section 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); 
      } 

de HTTPService de Scroller:

<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") { 

extraits de 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 

>

Répondre

0
  1. appel setTimeout (DebuterAnimation, 1000). Probablement plus facile que de créer une minuterie. Ou utilisez simplement la fonction "callLater" sur UIComponents. Sur la même note ... vous pouvez utiliser setInterval (func, 33) au lieu de ENTER_FRAME (en supposant environ 30 images/sec).

  2. Pour rechercher lorsqu'un élément est prêt, écoutez l'événement FlexEvent.CREATION_COMPLETE.

+0

Merci pour les conseils. Je vais leur donner un essai. – Todd

1

Je crois que le problème est avec mon pauvre compréhension de la composante cycle de vie et je grandement apprécier quelques conseils

Excellent white paper on the Flex Component Lifecycle. Bien que ne sont pas spécifiquement votre question, si vous vous sentez comme vous voulez des connaissances sur le cycle de vie, cela vous aura couvert.

+0

Merci pour le lien, je vais vérifier. – Todd

Questions connexes