如何为 Flex Datagrid 制作可重复使用的 labelFunction?
Posted
技术标签:
【中文标题】如何为 Flex Datagrid 制作可重复使用的 labelFunction?【英文标题】:How can i make a reusable labelFunction for Flex Datagrid? 【发布时间】:2010-09-22 23:47:33 【问题描述】:我有一个标签功能,例如:
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”,这会很好。我想让这个函数通用,这样我就可以在任何地方使用它。
我该怎么做。我认为我需要使用某种“反思”——或者可能是另一种方法?
【问题讨论】:
【参考方案1】:您可以使用该列的 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);
-本
【讨论】:
这应该是真正的答案。您甚至可以在 util 类中创建public static
(例如 GridUtils
)并在整个应用程序中使用它(例如 labelFunction="GridUtils.formatDate"
)
这是一个很好的答案。另一个比较复杂。除了我刚刚返回 df.format(item[column.dataField]);【参考方案2】:
您可以定义另一个函数,我们称之为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));
当它被调用时,它或多或少与 this 相同
function( item : Object, column : DataGridColumn ) : *
return formatDate("startDate", item, column);
多田!
【讨论】:
【参考方案3】:这里是更通用的方式:
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 数据网格
var labelFunction = getDateLabelFunction(null,true);
传递自定义日期格式字符串:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
默认为“MM/DD/YYYY”;
【讨论】:
以上是关于如何为 Flex Datagrid 制作可重复使用的 labelFunction?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 WPF DataGrid 获取 IsSelectionActive?