[英]Flex actionscript extending DateChooser, events in calendar
ExtendedDateChooser類是我的flex項目中使用的簡單事件日歷的絕佳解決方案。 您可以在Google的“將日歷事件條目添加到Flex-DateChooser-Component”中找到它,並在帖子評論中添加更新的解決方案鏈接。 我在下面發布了文件。
日歷中的問題是當月份更改時缺少文本事件。
就像dateChooser flex組件一樣,ActionScript中是否存在updateCompleted
事件? 像:
<mx:DateChooser id="dc" updateCompleted="goThroughDateChooserCalendarLayoutAndSetEventsInCalendarAgain()"</mx>
當添加
scroll
事件時(在Actionscript中可用),它會被調度,但是在updateDisplayList()
被激發后,所以沒有設法回答, 為什么刪除日歷事件?
有什么建議,可以在代碼中添加什么,也許可以覆蓋某些功能?
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>
只是改變FlexEvent.CREATION_COMPLETE
在ExtendedDateChooser.as到FlexEvent.UPDATE_COMPLETE
那應該做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.