8

我有一个标签功能,如:

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”,这很好用。我想让这个函数通用,这样我就可以在任何地方使用它。

我怎样才能做到这一点。我想我需要使用某种“反思”——或者完全是另一种方法?

4

3 回答 3

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);
}

-本

于 2009-04-21T17:42:02.997 回答
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在参数列表中添加了一个名为 first 的新参数,并将所有对“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));
}

但是funcandboundArgs是你作为参数传递给 的partial,所以你可以说它看起来像这样:

function( ...dynamicArgs ) : * {
  return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}

当它被调用时,它或多或少与 this 相同

function( item : Object, column : DataGridColumn ) : * {
  return formatDate("startDate", item, column);
}

多田!

于 2008-11-19T08:18:59.533 回答
1

这是更通用的方式:

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 数据网格)

var labelFunction = getDateLabelFunction();

或用于 MX 数据网格

var labelFunction = getDateLabelFunction(null,true);

传递自定义日期格式字符串:

var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);

默认为“MM/DD/YYYY”;

于 2013-01-07T18:29:58.900 回答