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

引数リストに firstという新しい引数を追加し、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));
}

しかし、funcboundArgsは に引数として渡したものなpartialので、次のように言えます。

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

これは、呼び出されると、多かれ少なかれこれと同じになります

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

var labelFunction = getDateLabelFunction();

または MX Datagrid の場合

var labelFunction = getDateLabelFunction(null,true);

カスタム日付フォーマット文字列を渡すには:

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

デフォルトは「MM/DD/YYYY」です。

于 2013-01-07T18:29:58.900 に答える