Flex Datagridの再利用可能なlabelFunctionを作成するにはどうすればよいですか?
-
08-07-2019 - |
質問
次のようなラベル関数があります:
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」の場合、これは問題なく機能します。どこでも使用できるように、この関数を汎用的にしたい。
これを行うにはどうすればよいですか。何らかの「リフレクション」を使用する必要があると思いますか、それとも別のアプローチを使用する必要がありますか?
解決
別の関数を定義できます。追加の引数を関数にバインドする 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);
}
多田!
他のヒント
アイテムのキーとして列の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);
}
-Ben
こちらがより一般的な方法です:
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&quot ;;