Как я могу сделать функцию многократного использования для Flex Datagrid? - PullRequest
8 голосов
/ 19 ноября 2008

У меня есть функция метки вроде:

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. Я хочу сделать эту функцию общей, чтобы использовать ее везде.

Как я могу это сделать. я думаю, что мне нужно использовать какое-то «отражение» - или, возможно, вообще другой подход?

Ответы [ 3 ]

14 голосов
/ 21 апреля 2009

Вы можете сделать функцию универсальной, используя атрибут 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);
}

-Бен

11 голосов
/ 19 ноября 2008

Вы можете определить другую функцию, давайте назовем ее 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 - это то, что вы передали в качестве аргументов partial, так что вы можете сказать, что это выглядит так:

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

, который, когда он вызывается, будет более или менее таким же, как этот

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

Тад!

0 голосов
/ 07 января 2013

вот более общий способ:

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

По умолчанию используется значение «ММ / ДД / ГГГГ»;

...