Как я могу создать многоразовую функцию labelFunction для Flex Datagrid?
-
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);
}
-Бен
вот более общий способ:
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";