访问未定义的属性 itemRenderer(键盘事件)
Posted
技术标签:
【中文标题】访问未定义的属性 itemRenderer(键盘事件)【英文标题】:Access to undefined property itemRenderer (Keyboard Event) 【发布时间】:2016-01-25 17:31:24 【问题描述】:当我在数据网格中的一行上按 Enter 键时,我试图让以下代码运行,当我单击该行 (ListEvent) 时它可以工作,但是当按 enter 键时如何启用它(键盘事件)。尽管每次都会抛出此错误,但我的 enter 键仍在工作
private function onButtonClick(evt:KeyboardEvent):void
var item:Object = evt.itemRenderer.data;
openWorkflowItem(item.date.date, item.workFlowID);
$multiEdit = false;
if (target === currentWorkflowItems)
$histFilter['sym'] = item.sym;
histSym.text = item.sym;
applyHistFilters();
<mx:AdvancedDataGrid
id="historicalWorkflowItems"
dataProvider="$historicalWFItems"
itemClick="onWFItemClick(event)"
keyDown="if (event.keyCode==Keyboard.ENTER) onButtonClick(event)"
borderStyle="none"
sortExpertMode="true"
useHandCursor="true"
headerShift="saveColumnSettings('historical', historicalWorkflowItems)"
columnStretch="saveColumnSettings('historical', historicalWorkflowItems)"
horizontalScrollPolicy="auto"
verticalScrollPolicy="auto"
allowMultipleSelection="true"
>
【问题讨论】:
KeyboardEvent
没有 itemRenderer
属性。检查以查看 target
或 currentTarget
的值。你在哪里添加你的键盘监听器?
我在高级数据网格中使用这个 keyDown="if (event.keyCode==Keyboard.ENTER) onButtonClick(event)"
在哪里?在您的问题中发布该代码,到目前为止您提供的内容不足以回答。
什么是onButtonClick
?
上面的函数,虽然命名可能更好(例如onKeyHit)
【参考方案1】:
问题是您正在为网格分配一个键侦听器,因此在此上下文中没有特定项目。 keyDown
事件会在网格内任何地方 的焦点被按下时触发。你想要itemKeyDown
之类的东西,但网格似乎没有为你提供这样的事件。
这就是为什么我要求您检查Event/target
以查看它的价值。如果一个项目渲染器有焦点并且用户按下一个键,你的处理程序将被触发并且你可以检查事件target
是否是一个项目渲染器,例如if(event.target is AdvancedDataGridItemRenderer)
。 (事件currentTarget
将始终是网格。)现在,我对AdvancedDataGrid
项目渲染的实现不是非常熟悉,但很可能事件target
本身不会是项目渲染器,只是一个项目渲染器的子项(比如项目渲染器内的文本字段)。要检查 target
是否在 inside 中,可以通过遍历显示树并检查父级 is
是否为项目渲染器类:
function findItemRenderer(object:DisplayObject):AdvancedDataGridItemRenderer
var current:DisplayObject = object;
while(current && !(current is AdvancedDataGrid))
if(current is AdvancedDataGridItemRenderer)
return current as AdvancedDataGridItemRenderer;
current = current.parent;
return null;
现在您可以像这样处理您的事件:
function gridKeyDown(e:KeyboardEvent):void
var item:AdvancedDataGridItemRenderer = findItemRenderer(e.target as DisplayObject);
if(item)
// do stuff with your item
但是像这样搜索显示层次结构有点愚蠢。您应该做的只是从您的项目渲染器内部调度一个事件,以便事件目标始终是项目渲染器本身。例如:
class MyItemRenderer extends AdvancedDataGridItemRenderer
public static const ITEM_ENTER:String = "itemEnter";
public MyItemRenderer()
addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
private function keyDown(e:KeyboardEvent):void
if(e.keyCode == Keyboard.ENTER)
dispatchEvent(new Event(ITEM_ENTER, true)); // bubbles=true
现在你可以处理这个事件了:
myGrid.addEventListener(MyItemRenderer.ITEM_ENTER, itemEnter);
function itemEnter(e:Event):void
var item:MyItemRenderer = e.target as MyItemRenderer;
// do stuff with your item
【讨论】:
以上是关于访问未定义的属性 itemRenderer(键盘事件)的主要内容,如果未能解决你的问题,请参考以下文章
使用 actionscript 为 datagrid 创建自定义 itemrenderer
Flex:当自定义 itemrenderers 中的文本更改时,强制重绘 DataGrid
Flex - 将参数发送到自定义 ItemRenderer?