我有一个标签功能,如:
private function formatDate (item:Object, column:DataGridColumn):String
{
var df:DateFormatter = new DateFormatter();
df.formatString = "MM/DD/YY";
if (column.dataField == "startDate") {
return df.format(item.startDate);
}
return "ERR";
}
我使用labelFunction
在数据列中使用。
如果我的数据字段被称为'startDate',这可以正常工作。我想让这个函数变得通用,所以我可以在任何地方使用它。
我该怎么做?我想我需要使用某种“反思” - 或者完全是另一种方法?
答案 0 :(得分:14)
您可以使用列的dataField属性将该函数设置为通用函数作为项目的键。
private function formatDate (item:Object, column:DataGridColumn):String
{
var df:DateFormatter = new DateFormatter();
df.formatString = "MM/DD/YY";
var value:object = item[column.dataField];
return df.format(value);
}
-Ben
答案 1 :(得分:11)
你可以定义另一个函数,让我们称之为partial
,它将一些额外的参数绑定到你的函数中:
function partial( func : Function, ...boundArgs ) : Function {
return function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs))
}
}
然后你改变你的功能:
private function formatDate( dataField : String, item : Object, column : DataGridColumn ) : String {
var df : DateFormatter = new DateFormatter();
df.formatString = "MM/DD/YY";
if ( column.dataField == dataField ) {
return df.format(item[dataField]);
}
return "ERR";
}
请注意,我在参数列表中首先添加了一个名为dataField
的新参数,并将所有对“startDate”的引用替换为该参数。
并像这样使用它:
var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction : Function = partial(formatDate, "endDate");
partial
函数返回一个新函数,该函数调用原始函数,调用参数与参数连接到新函数...你跟我一起?放置它的另一种方法是它可以返回一个新函数,其中N个参数预先绑定到特定值。
让我们一步一步地完成它:
partial(formatDate, "startDate")
返回一个如下所示的函数:
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
但func
和boundArgs
是您作为[{1}}参数传递的内容,因此您可以说它看起来像这样:
partial
,当它被调用时,将与此
或多或少相同function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
多田!
答案 2 :(得分:0)
这里有更通用的方法:
public static function getDateLabelFunction(dateFormatString:String=null, mxFunction:Boolean = false) : Function {
var retf:Function;
// defaults
if(dateFormatString == null) dateFormatString = "MM/DD/YY";
if(mxFunction) {
retf = function (item:Object, column:DataGridColumn):String
{
var df:DateFormatter = new DateFormatter();
df.formatString = dateFormatString;
var value:Object = item[column.dataField];
return df.format(value);
}
}else {
retf = function (item:Object, column:GridColumn):String
{
var df:DateFormatter = new DateFormatter();
df.formatString = dateFormatString;
var value:Object = item[column.dataField];
return df.format(new Date(value));
}
}
return retf;
}
用法(Spark DataGrid)
var labelFunction = getDateLabelFunction();
或MX Datagrid
var labelFunction = getDateLabelFunction(null,true);
传递自定义日期格式字符串:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
默认为“MM / DD / YYYY”;