Flex Datagrid labelFunction query
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>
А) Может кто-нибудь объяснить, как Datagrid внутренне работает с функцией employeeName? Я имею в виду, я даже не передаю 2 параметра для labelFunction, НО все же, как он вызывается?
Б) Почему я должен использовать тег s:ArrayList внутри тега s:columns?
2 ответа
А) Может кто-нибудь объяснить, как 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?
Поскольку тип данных свойства столбцов в DataGrid - это IList; и ArrayList реализует интерфейс IList. То, на что вы обращаете внимание, - это способ MXML для создания и определения ArrayList. Вы бы использовали немного другой подход, если бы хотели создать столбцы в ActionScript.
Чтобы ответить на ваш первый вопрос: свойство labelFunction является ссылкой на функцию, которая будет вызываться DataGrid для форматирования текста ячейки в столбце. Функция будет вызываться динамически, и DataGrid будет передавать необходимые параметры. DataGrid ожидает, что функция метки всегда будет иметь эту подпись. Если вы этого не сделаете, вы получите ошибку во время выполнения.
Технически, функция может вызываться динамически со следующим синтаксисом:
var anObject:MyType;
var methodName:String = "myMethod";
anObject[methodName](param1, param2);
или если у вас есть объект Function
var myFunction:Function;
myFunction(param1, param2);