访问未定义的属性 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 属性。检查以查看 targetcurrentTarget 的值。你在哪里添加你的键盘监听器? 我在高级数据网格中使用这个 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?

Flex 4.5:带有自定义 ItemRenderes 的 Spark DataGrid

使用自定义ItemRenderer和Effects的TileList