在Flextras日历中访问DayRender上的自定义数据

时间:2010-11-29 23:54:04

标签: flex

我创建了自定义日渲染,我想访问Flextras Calendar dataProvider中提供的一些自定义数据。

这是我的代码

    <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%"
  />

这是我正在创建的Object类型,并在ArrayCollection中传递故事并传递给Calenders dataProvider

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

以下是我的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();
  }


 }
}

我需要了解的是如何查看渲染器是否具有自定义数据,以便我可以在渲染器创建完成时执行一些逻辑。

感谢, 马修

1 个答案:

答案 0 :(得分:1)

dayRenderer中的Flextras Calendar概念上是基于基于Flex列表的类中的itemRenderers建模的。这意味着当您更改一个月,一天或一年,替换当前数据时,可以重复使用渲染器。

在您当前的dayRenderer中,您可能在设置任何数据之前执行init()方法。

您应该绑定到Flex组件生命周期,以便在创建(或更改)数据时进行更改,而不是使用creationComplete。由于您要检查dataProvider,您应该查看dayData对象。我会覆盖set方法,如下所示:

protected var dayDataChanged : Boolean = false;

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

您还可以将当前的dataProvider与新的一个进行比较,以查看是否有任何更改,以及如果有的话还是有效的invalidateProperties()。

在commitProperties()中,尝试这样的事情:

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

我将使用您当前的dataProvider项添加,日期将默认为“今天”,这是不寻常的。日期通常不会动态设置为当前日期。

我还要添加dataProvider中的dateField命名为'date',但是你指定的dateField属性是'data'。在这种情况下,日历可能永远不会将dataPRovider的数据发送到dayRenderer,因为它无法确定它应该在哪一天结束。