2010-11-29 8 views
0

J'ai créé un rendu de jour personnalisé et j'aimerais accéder à certaines données personnalisées que je fournis dans le fournisseur de données de calendrier Flextras.Accès aux données personnalisées sur DayRender dans Flextras Calendrier

ici est le code que j'ai

<flextras:Calendar 
    id="calendar" 
    dayRenderer="com.healthways.healthhonors.itemrenderers.MyAwesomeDayRenderer" 
    monthHeaderRenderer="com.healthways.healthhonors.itemrenderers.MyAwesomeMonthRenderer" 
    displayedYear="2010" 
    displayedDate="1" 
    displayedMonth="10" 
    dateField="data" 
    width="100%" 
    height="100%" 
    /> 

Voici le type d'objet que je crée et storying dans une sorcière ArrayCollection est passée au Calandres dataProvider

myArrayCollection = new ArrayCollection([{date:new Date(), data:myObject}]) 

Voici ce à quoi ressemble mon Day Render

package com.healthways.healthhonors.itemrenderers 
{ 
import com.healthways.vo.DateVO; 
import nl.demonsters.debugger.MonsterDebugger; 
import com.healthways.vo.MedicationVO; 
import mx.collections.ArrayCollection; 
import mx.utils.ObjectUtil; 
import com.flextras.calendar.IDayDataVO; 
import com.flextras.calendar.ICalendarDataVO; 
import mx.events.ResizeEvent; 
import mx.events.FlexEvent; 
import com.healthways.components.DailyPieChart; 
import com.flextras.calendar.defaultRenderers.DayRenderer; 

/** 
    * @author Matthew Wallace 
    */ 
public class CalendarMedicationRenderer extends DayRenderer 
{ 
    private var chart : DailyPieChart; 
    public function CalendarMedicationRenderer() 
    { 
    init(); 

    } 

    private function init() : void 
    { 
    percentWidth = 100; 
    percentHeight = 100; 

    chart = new DailyPieChart(); 
    this.addElement(chart);  

    addEventListener(ResizeEvent.RESIZE, onResize); 
    addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete); 
    } 

    private function onCreationComplete(event : FlexEvent) : void 
    { 
     /* here I would like to set chart display object visible 
          based on if I have custom data in the renderer or not */ 
    } 

    private function onResize(event : ResizeEvent) : void 
    { 
    chart.x = (width * 0.5) - 25; 
    chart.y = (height * 0.5) - 25; 
    } 


    override protected function createExpandDayButton() : void 
    { 
    //super.createExpandDayButton(); 
    } 

    override protected function createDayTextField() : void 
    { 
    //super.createDayTextField(); 
    } 


} 
} 

ce que j'ai besoin de comprendre s comment voir si un moteur de rendu a des données personnalisées afin que je puisse faire une certaine logique sur la création des moteurs de rendu terminée.

merci, Matthew

Répondre

1

Le dayRenderer dans le Flextras Calendar est, sur le plan conceptuel, calquée sur itemRenderers dans les classes sur la base liste Flex. Cela signifie que le moteur de rendu peut être réutilisé lorsque vous modifiez un mois, un jour ou une année en remplaçant les données actuelles.

Dans votre dayRenderer actuel, il est probable que vous exécutez la méthode init() avant toute donnée.

Vous devez vous lier au cycle de vie des composants Flex pour apporter des modifications lorsque des données sont créées (ou modifiées) au lieu d'utiliser creationComplete. Puisque vous voulez examiner le dataProvider, vous devriez regarder l'objet dayData. Je substituez la méthode de jeu, quelque chose comme ceci:

protected var dayDataChanged : Boolean = false; 

override public function set dayData(value:IDayDataVO):void{ 
    super._dayData = value; 
    this.dayDataChanged = true; 
    this.invalidateProperties(); 
} 

Vous pouvez aussi faire un peu plus avancé pour comparer le fournisseur de données en cours avec le nouveau pour voir si quelque chose a changé, et invalidateProperties() sous condition si elle a/n'a pas.

Dans commitProperties(), essayez quelque chose comme ceci:

if(this.dayDataChanged == true){ 
// access this.dayData.dataProvider and perform whatever processing is needed 
this.dayDataChanged = false; 
} 

J'ajouterai que votre article dataProvider en cours, la date par défaut « aujourd'hui », ce qui est inhabituel. La date n'est généralement pas définie dynamiquement à la date actuelle.

Je vais aussi ajouter Le champ dateField dans votre dataProvider est nommé 'date' mais la propriété dateField que vous spécifiez est 'data'. Dans ce cas, le calendrier ne peut jamais envoyer les données d'un dataPRovider à dayRenderer car il ne peut pas déterminer le jour où il devrait se terminer.