`

Flex: labelFunction versus ItemRenderer

    博客分类:
  • FLEX
阅读更多
When to Use labelFunction versus ItemRenderer:
http://www.kylehayes.info/2007/10/09/When-to-Use-labelFunction-versus-ItemRenderer/


理解 Flex itemRenderer 系列:
英文:
http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html
中文:
第 1 部分:内联渲染器 http://www.adobe.com/cn/devnet/flex/articles/itemrenderers_pt1.html
第 2 部分: 外部渲染器 http://www.adobe.com/cn/devnet/flex/articles/itemrenderers_pt2.html
引用
listData as DataGridListData-它将 listData 转换为 DataGridListData 对象, 使您能访问它的 dataField
.dataField-该字段用于渲染的列。它使这个 itemRenderer 变得一般。可以将这个 itemRenderer 用于多个列。在本例中, dataField 是“price”。
data[ ... ]-它访问项目中特定字段的数据。在本例中, 它是价格列。

记住, itemRenderer 是循环使用的, 所以如果测试失败, 还必须将颜色设置回白色。否则, 当用户滚动列表时, 所有 itemRenderer 最终将变为紫色。
注意: 请记住 itemRenderer 是循环使用的, 所以您必须始终恢复值;不要在 itemRenderer 中保留 if 而没有 else。




在我已知概念里的一丁点儿总结:一
引用
对于DataGridColumn,可对列数据做处理的属性有
labelFunction(参数为Function)
itemRenderer(参数为IFactory)  两个;

而对于ComboBox,可对数据列表做处理的属性有
labelFunction(参数为Function)
labelToItemFunction(参数为Function)
itemRenderer(参数为IFactory)
itemRendererFunction(参数为Function) 四个
这里让我纠结的是,ComboBox的itemRenderer和itemRendererFunction到底啥区别那?待着日抽空google下。



Setting the itemRenderer or itemEditor property in ActionScript:
http://livedocs.adobe.com/flex/3/html/help.html?content=cellrenderer_4.html
引用
// Cast listData to DataGridListData. 
                var myListData:DataGridListData = 
                    DataGridListData(listData);
                
                // Access information about the data passed 
                // to the cell renderer.
                text="row index: " + String(myListData.rowIndex) + 
                    " column index: " + String(myListData.columnIndex);





自定义itemRenderer:

Adobe Flex 4.5 -> Creating MX inline item renderers and editors:
http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7ca4.html
引用
The <fx:Component> tag defines a new scope in an MXML file, where the local scope of the item renderer or item editor is defined by the MXML code block delimited by the <fx:Component> and </fx:Component> tags. To access elements outside of the local scope of the item renderer or item editor, you prefix the element name with the outerDocument keyword.

For example, you define one variable named localVar in the scope of the main application, and another variable with the same name in the scope of the item renderer. From within the item renderer, you access the application’s localVar by prefixing it with outerDocument keyword


要注意:使用<fx:Component>会改变变量的scope。所以,在<fx:Component>中,是可以定义和外部名字相同的变量的;如<fx:Component>外部已定义了名为domintDataProvider的变量:
<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
		
		<!-- 航班性质 -->
		<s:ArrayList id="domintDataProvider">
			<fx:Object label="国内" data="D"/>
			<fx:Object label="国际" data="I"/>
		</s:ArrayList>
在component内部你仍然可以定义一个同名的变量domintDataProvider。并且这两个同名的变量是完全不同的,因为它们在不同的作用域scope中:
<fx:Component>
						<mx:VBox horizontalCenter="0">
							<fx:Script>
								<![CDATA[           
									import mx.collections.ArrayList;
									
									import spark.components.Label; //这里还必须得import一次? so strange!
									// Variable in the renderer scope.
									//internal var domintLabel:String = "";
									private var domintDataProvider:ArrayList = outerDocument.domintDataProvider;
对mx.collections.ArrayList的import声明,在<fx:Component>中必须也得再次做一次(即使你在<fx:Component>的外部已经import了一次;但这里的<fx:Component>已经彻底改变了变量等的作用域scope,外部的import在<fx:Component>内已不可用)
总之一句话:<fx:Component>会创造一个全新的scope!
那在<fx:Component>内部怎么使用其外部的变量等那?答案是通过outerDocument关键字来使用,正如上面引用中提到的那样。另外,如果<fx:Component>想访问的变量不在<fx:Component>的定义文件中,而在其定义文件的父文件中,这时想访问这个的话,可以使用 parentDocument 关键字:
http://flextips.corank.com/tech/story/using-parentdocument-or-outerdocument-
引用
This one saved me a LOT of time the other day. When using inline itemRenderers, the <mx:Component> tag that you have to write before the itemRenderer tags marks a change of scope. To call methods on the parent mxml document from an inline renderer , use the parentDocument property.


重写set data()方法时:
记得要加 super.data = value;
override public function set data(value: Object):void {
										super.data = value; //这句代码必须写上!
										//自己加的处理代码
									}
http://vikinghammer.com/2009/02/25/flex-make-sure-to-call-super-in-item-renderer-override-methods/




通过itemrender让datagrid中选定的行的字体变粗:
Flex DataGrid Selected Row Styling:
http://www.switchonthecode.com/tutorials/flex-datagrid-selected-row-styling


通过工厂去创建datagrid列的itemrender;适用为动态增加的datagridcolumn添加itemrender:
DIFFERENT ROWS IN DATAGRID – PROGRAMMATICALLY ADDED ITEMRENDERERS (CLASSFACTORY AND IFACTORY):
http://www.flexer.info/2009/01/09/different-rows-in-datagrid-programmatically-added-itemrenderers-classfactory-and-ifactory/

Flex datagrid/advancedatagrid按条件显示行的背景颜色:
http://blog.csdn.net/cfhacker007/archive/2010/08/03/5784523.aspx





在datagrid中使用itemRenderer后,可能出现的问题
1 datagrid中itemDoubleClick 失效的问题:
Flex : DataGrid ItemRenderer当某列使用了itemRenderer后,在该列的空白处双击,不会触发itemDoubleClick处理。下面的解决方式,试过,不好使:
Flex : DataGrid ItemRenderer and DoubleClick :
http://www.kerkness.ca/flex-datagrid-itemrenderer-and-doubleclick-oh-my/
2 datagrid中contextMenu 失效问题:
datagrid添加了自定制的contextMenu;当某列使用了itemRenderer后,在该列点击右键,contextMenu无效。下面的解决方式,试过,不好使:
Flex4 ContextMenu() not showing added Items:
http://stackoverflow.com/questions/5312115/flex4-contextmenu-not-showing-added-items





完整的itemRenderer例子:
<mx:DataGridColumn headerText="@Resource(bundle='messages_zh_CN', key='fidsDepf.grid.domint')" dataField="domint" >
				<mx:itemRenderer>
					<fx:Component>
						<mx:VBox horizontalAlign="center">
							<fx:Script>
								<![CDATA[           
									import mx.collections.ArrayCollection; //这里还必须得import一次? so strange!
									// Variable in the renderer scope.
									[Bindable]
									private var domintLabel:String = "";
									private var domintDataProvider:ArrayCollection;
									override public function set data(value: Object):void {
										super.data = value; //这句代码必须写上!
										domintDataProvider = outerDocument.domintDataProvider;
										for(var i:int=0; i<domintDataProvider.length; i++) {
											if(domintDataProvider.getItemAt(i).data == value.domint) {
												domintLabel = domintDataProvider.getItemAt(i).label;
											} else {
												///
											}
										}
									}
								]]>
							</fx:Script>
							<s:Label text="{domintLabel}" />
						</mx:VBox>
					</fx:Component>
				</mx:itemRenderer>
			</mx:DataGridColumn>
分享到:
评论

相关推荐

    Flex ColumnChart获取得焦点改变颜色

    - `LinearAxis`:定义了纵轴为线性轴,`baseAtZero="false"`表示纵轴不一定从零开始,`minimum`和`maximum`则设置了纵轴的最小值和最大值范围,`labelFunction`引用了自定义的`linearAxis_labelFunc`函数来格式化轴...

    flex 常用组件附例子介绍

    ### Flex常用UI组件详解 #### 一、DataGrid 组件 **DataGrid** 是 Flex 中一个非常重要的组件,主要用于展示表格形式的数据集。它能够显示包含多列数据的信息,并提供了丰富的交互特性,使得用户能够方便地操作...

    flex4 选择树组件

    6. **自定义节点**:除了基本的文本节点,你还可以创建自定义节点组件,这可以通过`itemRenderer`属性实现。自定义渲染器可以为每个节点提供更复杂的视图,如包含图标、复选框或其他UI元素。 7. **折叠与展开**:...

    flex 映射DataGrid,修改DataGridColumn显示值

    ### Flex中DataGrid某列显示值的自定义与字体颜色更改 #### 一、自定义DataGridColumn显示值 在Flex中,我们可以通过多种方式来定制DataGrid中的DataGridColumn的显示内容,例如更改显示的文本或者根据不同的条件...

    Flex画 坐标轴曲线 项目用过的 flex4 开发

    1. **Spark图表组件**:Flex4引入了Spark图表组件,相比先前的MX图表,Spark图表提供了更丰富的样式和更好的性能。主要的类包括`LineChart`,它可以绘制线条连接的数据点,非常适合用来展现曲线趋势。 2. **数据...

    flex做的四种图表(线、柱、饼、区域)直接用js调用

    每个扇区代表数据源中的一个条目,通过PieSeries类设置数据系列,调整sliceWidth表示每个扇区的大小,使用labelFunction可以自定义每个扇区的标签内容。 区域图则强调了数据的范围和区间,通常用于展示连续性数据的...

    Flex数据显示与数据验证

    根据给定的信息,本文将详细解析Flex中的数据验证与显示技术。主要聚焦于Flex框架下对日期、货币以及字符串等数据类型的验证与显示方法,并通过示例代码进行具体阐述。 ### Flex中的数据验证 Flex提供了丰富的功能...

    flex 统计,柱状图,饼图。

    `labelFunction`可以自定义显示的标签,`showDataLabels`属性控制是否显示数据标签,而`explodeRatio`可以设置某个扇区突出的比例。 为了方便使用,通常会预先打包好这些图表组件,形成库或者独立的SWC文件,用户...

    flex4 dataGrid 日期格式转换

    总结起来,Flex 4中的`DataGrid`通过结合`DateFormatter`和自定义的`labelFunction`可以方便地实现日期格式的转换,使数据显示更加人性化。理解并熟练运用这些技巧,可以提升用户体验,增强应用程序的易用性。

    一个非常不错的flex时间控件,内附运行图

    一个非常不错的flex时间控件 &lt;local:UXDateField selectedDate="{new Date()}" labelFunction="selectDateTime" width="150"/&gt; public function selectDateTime(item:Date):String { return item.fullYear ...

    Flex datagrid 自动设置列宽

    function onGridUpdateComplete(event:FlexEvent):void { for (var i:uint = 0; i ; i++) { var col:GridColumn = dataGrid.columns[i]; var maxWidth:Number = 0; for each (var item:Object in dataGrid.data...

    flex4.5学习笔记

    **知识点1:Flex布局** - **垂直布局** (`s:VerticalLayout`): 控件垂直排列。 - **水平布局** (`s:HorizontalLayout`): 控件水平排列。 - **平铺布局** (`s:TileLayout`): 类似于网格布局,自动调整大小以适应容器...

    Flex中tree实现的种种细节

    例如,`data`属性用于绑定数据,`labelFunction`可以自定义节点显示的文本,`itemRenderer`则允许我们定制每个节点的外观。另外,`childrenField`属性指定了数据对象中包含子项的字段名,这对于从数据源加载子节点至...

    Flex中DataGrid和其它控件使用

    1. **LabelField**:DataGrid中的每个单元格默认显示的是数据源中的简单文本,但有时我们可能需要自定义显示内容,这时可以使用LabelField或LabelFunction来实现。 2. **ButtonColumn**:如果需要在DataGrid中添加...

    flex tree的简单使用

    7. **样式和皮肤**:Flex提供了丰富的样式和皮肤机制,允许我们定制Tree组件的外观,包括字体、颜色、边框等。 在实际应用中,我们可能会遇到更复杂的需求,比如异步加载数据、自定义节点图标、拖放功能等。对于...

    flex学习笔记,技巧学习

    - **`labelFunction`**: 可以通过设置`labelFunction`属性来自定义ComboBox项的显示内容。例如,当需要显示复合数据(如姓名等)时,可以通过编写一个函数来实现这一功能。 ```actionscript private function ...

    Flex做雷达图例子

    在Flex中,可以使用`CategoryAxis`类来创建轴,并设置其`labelFunction`属性来自定义标签。图例可以通过`Legend`组件来创建,通过`dataProvider`属性关联到图表。 在`RadarChartTest`这个文件中,很可能包含了实现...

    flex 根据时间来画出动态曲线

    4. **labelFunction**: 自定义标签函数`mylabel`,用于格式化时间轴上的每个标签,使其显示为更友好的日期时间格式。 ### 动态数据更新机制 为了实现实时动态曲线图,案例中采用了一个定时器(`Timer`类)和一个...

    flex3的cookbook书籍完整版dpf(包含目录)

    设置控件的labelFunction 2.7节. 提供菜单数据 2.8. 动态填充菜单 2.9节. 为菜单类控件创建事件处理函数 2.10节. 显示一个通知窗口 2.11节. 使用Calendar控件 2.12节. 弹出窗口的显示和位置 2.13节. 自定义弹出式...

Global site tag (gtag.js) - Google Analytics