访问未定义的属性itemRenderer(键盘事件)

时间:2015-10-26 14:52:31

标签: actionscript-3 flex actionscript flash-builder itemrenderer

当我在数据网格中的某一行上输入时,我试图运行以下代码,当我点击该行(ListEvent)时它会起作用但是当我按下回车键时如何启用它(的KeyboardEvent)。我有输入键工作,虽然每次都会抛出此错误

Main

1 个答案:

答案 0 :(得分:0)

问题是您正在为网格分配一个键侦听器,因此在此上下文中没有特定项。每当按下一个键时,keyDown事件就会触发,并且网格中的任何位置 。你想要itemKeyDown之类的东西,但是网格似乎没有为你提供这样的事件。

这就是为什么我要求您检查Event/target以查看其包含的值。如果项呈示器具有焦点并且用户按下某个键,则会触发您的处理程序,您可以检查事件target是否为项呈示器,即if(event.target is AdvancedDataGridItemRenderer)。 (事件currentTarget将永远是网格。)现在,我对AdvancedDataGrid项呈现的实现不是很熟悉,但事件target本身可能不是项呈示器,只是项呈示器的子项(例如项呈示器中的文本字段)。要检查target是否 ,可以通过遍历显示树并检查父项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
}