Flex Datagrid를위한 재사용 가능한 labelfunction을 어떻게 만들 수 있습니까?

StackOverflow https://stackoverflow.com/questions/300950

문제

다음과 같은 레이블 기능이 있습니다.

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"입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top