我创建了自定义日渲染,我想访问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();
}
}
}
我需要了解的是如何查看渲染器是否具有自定义数据,以便我可以在渲染器创建完成时执行一些逻辑。
感谢, 马修
答案 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,因为它无法确定它应该在哪一天结束。