8 votes

Comment puis-je créer une labelFunction réutilisable pour Flex Datagrid ?

J'ai une fonction d'étiquette comme :

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

Que j'utilise dans une colonne de données en utilisant labelFunction .

Cela fonctionne parfaitement si mon champ de données s'appelle "startDate". Je veux rendre cette fonction générique pour pouvoir l'utiliser partout.

Comment puis-je faire cela ? Je pense que je dois utiliser une sorte de "réflexion" - ou peut-être une toute autre approche ?

14voto

Vous pouvez rendre la fonction générique en utilisant l'attribut dataField de la colonne comme clé dans votre élément.

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

11voto

Theo Points 60103

Vous pouvez définir une autre fonction, appelons-la partial qui lie des arguments supplémentaires à votre fonction :

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

Ensuite, vous modifiez votre fonction comme ceci :

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

Remarquez que j'ai ajouté un nouvel argument appelé dataField en premier dans la liste des arguments, et a remplacé toutes les références à "startDate" par cet argument.

Et utilise-le comme ça :

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

En partial renvoie une nouvelle fonction qui appelle la fonction originale avec les paramètres de l'appel au partiel concaténés avec les paramètres de la nouvelle fonction... vous me suivez ? Une autre façon de le dire est qu'il peut retourner une nouvelle fonction où N des arguments sont pré-liés à des valeurs spécifiques.

Voyons cela étape par étape :

partial(formatDate, "startDate") renvoie une fonction qui ressemble à ceci :

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

mais le func y boundArgs sont ce que vous avez passé comme arguments à partial On peut donc dire que ça ressemble à ça :

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

qui, lorsqu'elle sera appelée, sera plus ou moins la même que celle-ci

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

Tada !

1voto

Levancho Points 26

Voici un moyen plus générique :

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;

    }

Utilisation (Spark DataGrid)

var labelFunction = getDateLabelFunction();

ou pour MX Datagrid

var labelFunction = getDateLabelFunction(null,true);

pour passer une chaîne de format de date personnalisée :

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

La valeur par défaut est "MM/DD/YYYY" ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X