Ярлык Flex Datagrid Функциональный запрос

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? Я имею в виду, что я даже не передаю 2 параметра для labelFunction, НО все же как это вызывается?

Б) Почему я должен использовать тег s: ArrayList внутри тега s: columns?


person Joey River    schedule 08.08.2013    source источник
comment
На основании этого вопроса и вашего предыдущего вопроса; Я настоятельно рекомендую вам прочитать все документы Flex и открыть исходный код Flex Framework, чтобы ответить на свои вопросы. Я не понимаю, насколько уместны вопросы этого типа в StackOverflow.   -  person JeffryHouser    schedule 08.08.2013
comment
@ Reboog711 привет, я смотрел все эти видео отсюда: adobe.com/devnet/flex /videotraining.html Итак, что вы еще предлагаете мне прочитать?   -  person Joey River    schedule 08.08.2013
comment
Начните здесь: adobe.com/devnet/flex.html и здесь: adobe.com/devnet/flex/documentation.html. Вы многому научитесь, изучив исходный код, чтобы понять, как работают такие вещи, как labelFunction.   -  person JeffryHouser    schedule 08.08.2013
comment
@ Reboog711: спасибо, Reboog! Это необходимо мне знать об этих внутренних деталях? или вы говорите, что я трачу время зря, чтобы узнать о таких вещах?   -  person Joey River    schedule 08.08.2013
comment
Необязательно быть продуктивным - и я предполагаю, что большинство разработчиков Flex не знают внутренних деталей того, как создаются компоненты. Но это даст вам более глубокое понимание структуры.   -  person JeffryHouser    schedule 08.08.2013


Ответы (2)


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;
}

Б) Почему я должен использовать тег s: ArrayList внутри тега s: columns?

Поскольку тип данных свойства columns в DataGrid является IList; а ArrayList реализует интерфейс IList. Вы смотрите на способ MXML для создания и определения ArrayList. Вы бы использовали немного другой подход, если бы хотели создать столбцы в ActionScript.

person JeffryHouser    schedule 08.08.2013
comment
Спасибо большое! Кстати, можете ли вы хотя бы сказать мне, в чем разница между функцией в гибкости и методом в Java? Я очень хорошо знал метод ввода в Java (так что я не прошу вас объяснять это, НО меня смущает функция в Flex, это похоже на метод или что-то еще?) И спасибо за помощь :) - person Joey River; 10.08.2013
comment
Если вы хотите, чтобы я пошел на урок истории, я могу поговорить о различиях между функцией, методом и подпрограммой, однако для всех практических целей в современном мире; термин подпрограмма не используется; а функции и методы взаимозаменяемы. Различия, по большей части, чисто академические. - person JeffryHouser; 10.08.2013
comment
@Reeboog Привет, не могли бы вы также дать свой ответ здесь: http://stackoverflow.com/questions/18181342/flex-id-contentgroup-query - person Joey River; 12.08.2013
comment
@JoeyRiver Если я это увижу и что-нибудь добавлю; Я так и сделаю. Нет необходимости требовать ответов от людей. - person JeffryHouser; 12.08.2013

Чтобы ответить на ваш первый вопрос: свойство labelFunction - это ссылка на функцию, которая будет вызываться DataGrid для форматирования текста ячейки в столбце. Функция будет вызываться динамически, и DataGrid передаст необходимые параметры. DataGrid ожидает, что функция метки всегда будет иметь эту подпись. Если вы этого не сделаете, вы получите ошибку во время выполнения.

Технически функция может вызываться динамически со следующим синтаксисом:

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

anObject[methodName](param1, param2);

или если у вас есть объект Function

var myFunction:Function;
myFunction(param1, param2);
person Christophe Herreman    schedule 08.08.2013
comment
спасибо, Кристоф! но мой вопрос: как он вызывает эту функцию динамически? мне это необходимо знать об этом? или вы говорите, что я трачу время зря, чтобы узнать о таких вещах? - person Joey River; 08.08.2013
comment
Я добавил пример того, как метод вызывается динамически. Вам не нужно знать эти внутренние компоненты, хотя в какой-то момент это может помочь вам, если вам понадобится отладить код. - person Christophe Herreman; 08.08.2013
comment
Все в порядке, Кристоф, я думаю, сложно объяснить такую ​​внутреннюю функциональность, пока я не увижу ее исходный код. Кстати, ты можешь хотя бы сказать мне, в чем разница между функцией в flex и методом в java? Я очень хорошо знал метод ввода в Java (так что я не прошу вас объяснять это, НО меня смущает функция в Flex, это похоже на метод или что-то еще?) И спасибо за помощь :) - person Joey River; 08.08.2013