Flex Datagrid labelFunction查询

时间:2013-08-08 11:10:18

标签: actionscript-3 flex datagrid flex4 labelfunction

Main.mxl

<s:DataGrid dataProvider="{employeeData}"> // employeeData is an Arraycollection with predefined data


        <s:typicalItem>
            <s:DataItem firstName="Christopher" 
                        lastName="Winchester" 
                        hireDate="22/12/2013"/>
        </s:typicalItem>


        <s:columns>

            <s:ArrayList>

                <s:GridColumn labelFunction="employeeName"
                              headerText="Name"/>

                <s:GridColumn dataField="hireDate"
                              headerText="Hire Date"
                              labelFunction="dateFormat"/>
            </s:ArrayList>

        </s:columns>


    </s:DataGrid>   


<fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.dataGridClasses.DataGridColumn;
            import mx.rpc.events.ResultEvent;

            [Bindable]
            private var employeeData: ArrayCollection; 


            private function employeeName(item: Object, column: GridColumn): String
            {
                return item.firstName+" "+item.lastName;
            }


        ]]>
    </fx:Script>

A)任何人都可以向我解释一下Datagrid如何在内部使用 employeeName 功能?我的意思是,我甚至没有为labelFunction传递2个参数,但仍然如何调用它?

B)我为什么要在 s:columns 标记内使用 s:ArrayList标记

2 个答案:

答案 0 :(得分:0)

回答第一个问题:“labelFunction”属性是对DataGrid调用的函数的引用,用于格式化列中单元格的文本。该函数将动态调用,DataGrid将传递所需的参数。 DataGrid期望标签函数始终具有此签名。如果您没有这样做,您将收到运行时错误。

从技术上讲,可以使用以下语法动态调用函数:

var anObject:MyType;
var methodName:String = "myMethod";

anObject[methodName](param1, param2);

或者如果你有一个Function对象

var myFunction:Function;
myFunction(param1, param2);

答案 1 :(得分:0)

  

A)任何人都可以向我解释一下Datagrid的内部工作原理   有employeeName功能吗?我的意思是,我甚至没有传递2个参数   对于labelFunction,但仍然如何调用它?

labelFunction是GridColumn类的属性。在Gridcolumn中有一个itemToString()函数,用于确定该特定列实例的标签应该是什么。正好在框架代码之外:

/**
 *  @private
 *  Common logic for itemToLabel(), itemToDataTip().   Logically this code is
 *  similar to (not the same as) LabelUtil.itemToLabel().
 */
private function itemToString(item:Object, labelPath:Array, labelFunction:Function, formatter:IFormatter):String
{
    if (!item)
        return ERROR_TEXT;

    if (labelFunction != null)
        return labelFunction(item, this);

    var itemString:String = null;
    try 
    {
        var itemData:Object = item;
        for each (var pathElement:String in labelPath)
            itemData = itemData[pathElement];

        if ((itemData != null) && (labelPath.length > 0))
            itemString = (formatter) ? formatter.format(itemData) : itemData.toString();
    }
    catch(ignored:Error)
    {
    }        

    return (itemString != null) ? itemString : ERROR_TEXT;
}
  

B)为什么我应该在s:columns tag?

中使用s:ArrayList标签

因为DataGrid上的columns属性的数据类型是IList;并且ArrayList实现IList接口。您正在研究的是MXML创建和定义ArrayList的方法。如果要在ActionScript中创建列,则使用稍微不同的方法。