2010-03-29 6 views
1

La classe ExtendedDateChooser est une excellente solution pour le calendrier d'événements simple utilisé dans mon projet Flex. Vous pouvez le trouver si google pour "Ajouter-Calendrier-Event-Entrées-à-la-Flex-DateChooser-Component" avec un lien de la solution mise à jour dans les commentaires de la poste. J'ai posté des fichiers ci-dessous.ActionScript Flex extension de DateChooser, événements dans le calendrier

Problème dans ce calendrier: les événements de texte sont manquants lorsque le mois est modifié.

Y a-t-il un événement updateCompleted dans Actionscript, exactement comme dans le composant flexible dateChooser? Comme dans:

<mx:DateChooser id="dc" updateCompleted="goThroughDateChooserCalendarLayoutAndSetEventsInCalendarAgain()"</mx>

Lorsque l'événement scroll est ajouté, qui est disponible en Actionscript, il obtient expédié mais après updateDisplayList() est tiré, si n'a pas réussi à répondre, pourquoi sont événements du calendrier effacés?

Toutes les suggestions, ce qu'il faut ajouter dans le code, peut-être remplacer une fonction?

ExtendedDateChooserClass.mxml

<?xml version='1.0' encoding="utf-8"?> 

    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:mycomp="cyberslingers.controls.*" 
    layout="absolute" 
    creationComplete="init()"> 

    <mx:Script> 


<![CDATA[ 
    import cyberslingers.controls.ExtendedDateChooser; 
    import mx.rpc.events.ResultEvent; 
    import mx.rpc.events.FaultEvent; 
    import mx.controls.Alert; 

public var mycal:ExtendedDateChooser = new ExtendedDateChooser(); 

    // collection to hold date, data and label 
    [Bindable] 
    public var dateCollection:XMLList = new XMLList(); 

    private function init():void 
    { 
     eventList.send(); 
    } 

    private function readCollection(event:ResultEvent):void 
    { 
     dateCollection = event.result.calendarevent; 

     //Position and size the calendar 
     mycal.width = 400; 
     mycal.height = 400; 
     //Add the data from the XML file to the calendar 
     mycal.dateCollection = dateCollection; 
     //Add the calendar to the canvas 
     this.addChild(mycal); 
    } 

    private function readFaultHandler(event:FaultEvent):void 
    { 
     Alert.show(event.fault.message, "Could not load data"); 
    } 
]]> 
</mx:Script> 

<mx:HTTPService id="eventList" 
     url="data.xml" 
     resultFormat="e4x" 
     result="readCollection(event);" 
     fault="readFaultHandler(event);"/> 

</mx:Application> 

ExtendedDateChooser.as

package cyberslingers.controls 
{ 
import flash.events.Event; 
import flash.events.TextEvent; 

import mx.collections.ArrayCollection; 
import mx.controls.Alert; 
import mx.controls.CalendarLayout; 
import mx.controls.DateChooser; 
import mx.core.UITextField; 
import mx.events.FlexEvent; 



public class ExtendedDateChooser extends DateChooser 
{ 
    public function ExtendedDateChooser() 
    { 
     super(); 
     this.addEventListener(TextEvent.LINK, linkHandler); 
     this.addEventListener(FlexEvent.CREATION_COMPLETE, addEvents); 
    } 

    //datasource 
    public var dateCollection:XMLList = new XMLList(); 

    //-------------------------------------- 
    // Add events 
    //-------------------------------------- 
    /** 
    * Loop through calendar control and add event links 
    * @param e 
    */ 
    private function addEvents(e:Event):void 
    { 
     // loop through all the calendar children 
     for(var i:uint = 0; i < this.numChildren; i++) 
     { 
      var calendarObj:Object = this.getChildAt(i); 

      // find the CalendarLayout object 
      if(calendarObj.hasOwnProperty("className")) 
      { 
       if(calendarObj.className == "CalendarLayout") 
       { 
        var cal:CalendarLayout = CalendarLayout(calendarObj); 

        // loop through all the CalendarLayout children 
        for(var j:uint = 0; j < cal.numChildren; j++) 
        { 
         var dateLabel:Object = cal.getChildAt(j); 

         // find all UITextFields 
         if(dateLabel.hasOwnProperty("text")) 
         { 
          var day:UITextField = UITextField(dateLabel); 

          var dayHTML:String = day.text; 
          day.selectable = true; 
          day.wordWrap = true; 
          day.multiline = true; 
          day.styleName = "EventLabel"; 

          //TODO: passing date as string is not ideal, tough to validate 
          //Make sure to add one to month since it is zero based 
          var eventArray:Array = dateHelper((this.displayedMonth+1) + "/" + dateLabel.text + "/" + this.displayedYear); 
          if(eventArray.length > 0) 
          { 

           for(var k:uint = 0; k < eventArray.length; k++) 
           { 
            dayHTML += "<br><A HREF='event:" + eventArray[k].data + "' TARGET=''>" + eventArray[k].label + "</A>"; 
           } 
           day.htmlText = dayHTML; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    //-------------------------------------- 
    // Events 
    //-------------------------------------- 
    /** 
    * Handle clicking text link 
    * @param e 
    */ 
    private function linkHandler(event:TextEvent):void 
    { 
     // What do we want to do when user clicks an entry? 
     Alert.show("selected: " + event.text); 
    } 

    //-------------------------------------- 
    // Helpers 
    //-------------------------------------- 
    /** 
    * Build array of events for current date 
    * @param string - current date 
    * 
    */ 
    private function dateHelper(renderedDate:String):Array 
    { 
     var result:Array = new Array(); 
     for(var i:uint = 0; i < dateCollection.length(); i++) 
     { 
      if(dateCollection[i].date == renderedDate) 
      { 
       result.push(dateCollection[i]); 
      } 
     } 
     return result; 
    } 

} 
} 

data.xml

<?xml version="1.0" encoding="utf-8"?> 
<rss> 

<calendarevent> 
<date>8/22/2009</date> 
<data>This is a test 1</data> 
<label>Stephens Test 1</label> 
</calendarevent> 

<calendarevent> 
<date>8/23/2009</date> 
<data>This is a test 2</data> 
<label>Stephens Test 2</label> 
</calendarevent> 

</rss> 

Répondre

0

Changez simplement FlexEvent.CREATION_COMPLETE dans les ExtendedDateChooser.as à FlexEvent.UPDATE_COMPLETE

Cela devrait faire.

+0

Merci! :) Cela a résolu mon problème. – Nemi

Questions connexes