0

メイン.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 タグを使用する必要があるのはなぜですか?

4

2 に答える 2

0

A) Datagrid が内部で employeeName 関数とどのように連携するのか説明してもらえますか? つまり、labelFunction に 2 つのパラメーターを渡していませんが、それでもどのように呼び出されるのでしょうか?

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 タグ内で s:ArrayList タグを使用する必要があるのはなぜですか?

DataGrid の列プロパティのデータ型は IList であるためです。ArrayList は IList インターフェイスを実装します。あなたが見ているのは、ArrayList を作成および定義する MXML の方法です。ActionScript で列を作成する場合は、少し異なる方法を使用します。

于 2013-08-08T15:25:40.557 に答える
0

最初の質問に答えるには、「labelFunction」プロパティは、列内のセルのテキストをフォーマットするために DataGrid によって呼び出される関数への参照です。関数は動的に呼び出され、DataGrid は必要なパラメーターを渡します。DataGrid は、ラベル関数が常にこの署名を持つことを想定しています。そうしないと、実行時エラーが発生します。

技術的には、次の構文を使用して関数を動的に呼び出すことができます。

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

anObject[methodName](param1, param2);

または Function オブジェクトがある場合

var myFunction:Function;
myFunction(param1, param2);
于 2013-08-08T13:10:00.900 に答える