كيف يمكنني تقديم labelFunction يمكن إعادة استخدامها لفليكس Datagrid؟

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.

وهذا يعمل على ما يرام إذا كان يتم استدعاء حقل البيانات الخاصة بي "تاريخ البدء". أريد أن هذه الوظيفة عام حتى أتمكن من استخدامها في كل مكان.

وكيف يمكنني أن أفعل هذا. أعتقد أنني في حاجة إلى استخدام نوع من "التفكير" - أو ربما نهج آخر تماما

هل كانت مفيدة؟

المحلول

ويمكنك تحديد وظيفة أخرى، دعنا نسميها 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);
}

وتادا!

نصائح أخرى

ويمكنك جعل وظيفة عمومية باستخدام السمة 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;

    }

والاستخدام (سبارك 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