【问题标题】:How can i make a reusable labelFunction for Flex Datagrid?如何为 Flex Datagrid 制作可重复使用的 labelFunction?
【发布时间】: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”,这会很好。我想让这个函数通用,这样我就可以在任何地方使用它。

我该怎么做。我认为我需要使用某种“反思”——或者可能是另一种方法?

【问题讨论】:

    标签: apache-flex datagrid labelfunction


    【解决方案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));
    }
    

    但是 funcboundArgs 是您作为参数传递给 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”;

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 2011-04-27
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2019-07-11
        • 2010-12-20
        • 1970-01-01
        相关资源
        最近更新 更多