Pergunta

Eu tenho uma função rótulo como:

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

O que eu uso em um DataColumn usando labelFunction.

Isso funciona muito bem se o meu campo de dados é chamado de 'startDate'. Quero fazer esta função genérica para que eu possa usá-lo em todos os lugares.

Como posso fazer isso. Eu acho que preciso de usar algum tipo de 'reflexão' - ou talvez uma outra abordagem completamente

?
Foi útil?

Solução

Você pode definir outra função, vamos chamá-lo partial que liga alguns argumentos extras para a sua função:

function partial( func : Function, ...boundArgs ) : Function {
  return function( ...dynamicArgs ) : * {
    return func.apply(null, boundArgs.concat(dynamicArgs))
  }
}

Então você mudar a sua função como esta:

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

Observe que eu adicionei um novo argumento chamado dataField em primeiro lugar na lista de argumentos, e substituiu todas as referências a "startDate" com este argumento.

E usá-lo como este:

var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction   : Function = partial(formatDate, "endDate");

A função partial retorna uma nova função que chama a função original com os parâmetros da chamada para parcial concatenados com os parâmetros para a nova função ... você comigo? Outra maneira de colocá-lo é que ele pode retornar uma nova função onde N dos argumentos são pré-ligados a valores específicos.

Vamos passar por isso passo a passo:

partial(formatDate, "startDate") retorna uma função parecida com esta:

function( ...dynamicArgs ) : * {
  return func.apply(null, boundArgs.concat(dynamicArgs));
}

mas o func e boundArgs são o que você passou como argumentos para partial, então você poderia dizer que ele se parece com isso:

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

que, quando é chamado, será mais ou menos o mesmo que este

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

Tada!

Outras dicas

Você pode fazer a função genérica usando o atributo dataField da coluna como a chave em seu item.

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

aqui é a maneira mais genérica:

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;

    }

Uso (faísca DataGrid)

var labelFunction = getDateLabelFunction();

ou para MX Datagrid

var labelFunction = getDateLabelFunction(null,true);

para passar personalizado seqüência de data Formato:

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

O padrão é um "MM / DD / AAAA";

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top