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";
}
사용하여 Datacolumn에서 사용합니다 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
먼저 인수 목록에서, 모든 참조를 그 인수로 대체했습니다.
다음과 같이 사용하십시오.
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);
}
타다!
다른 팁
열의 데이터 필드 속성을 항목의 키로 사용하여 기능을 일반화 할 수 있습니다.
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"입니다.