Flex TabNavigator选项卡按钮未触发Click事件

时间:2012-05-01 16:09:56

标签: flex event-listener tabnavigator

我有一个TabNavigator,我正在尝试像Firefox一样工作,因为最后一个标签是一个特殊的“+”标签,它为控件添加了一个新标签。为此,我将事件处理程序添加到第一个选项卡的按钮,我使用tabNavigator.getTabAt(0).addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false)。我将优先级设置为int.MAX_VALUE,因此我的方法应该是第一个被调用的方法,然后可以阻止使用stopImmediatePropagation()调用其他处理程序。

我的问题是不时会调用我的点击处理程序,而是运行正常逻辑并切换到“+”标签。

CustomTab的代码(我删除了很多专有代码):

private var addTab:Function = null;
private var tabCreationAllowed:Boolean = true;

private function onCreationCompleted():void {
    var tabButton:Button = getTab(0);
    Container(getChildAt(0)).setStyle("closable", false);
    tabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);
    tabButton.addEventListener(MouseEvent.DOUBLE_CLICK, function(event:MouseEvent):void {event.stopImmediatePropagation(); }, false, int.MAX_VALUE, false);
}

private function clickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation();
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {
        this.tabCreationAllowed = false;
        this.addTab();
        var $this:CustomTab = this;
        setTimeout(function ():void {
            $this.tabCreationAllowed = true;
        }, 1500);
    }
}

1 个答案:

答案 0 :(得分:0)

在尝试了很多不同的事情之后,最好我能说出问题是TabBar用来创建标签按钮的TabNavigator可以切换什么按钮做什么(甚至可能删除和添加)但仅在添加或删除标签时。为了解决这个问题,我将“+”按钮存储在一个类变量中。然后我覆盖所有添加和删除方法。在每个我调用一个方法,从按钮中删除所有事件侦听器,如果我有一个,将变量设置为最后一个选项卡的按钮(这是“+”选项卡),然后重新添加监听器。

最终代码的缩减版本:

private var addTab:Function = null;  
private var tabCreationAllowed:Boolean = true;  
private var addTabButton:Button = null;

private function prerAddTabButton():void {
    if (addTabButton != null) {
        addTabButton.removeEventListener(MouseEvent.CLICK, clickFunction);
        addTabButton.removeEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction);
    }
    addTabButton = getTabAt(numChildren - 1);
    addTabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);  
    addTabButton.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction, false, int.MAX_VALUE, false);  
}

private function onCreationCompleted():void {  
    var tabButton:Button = getTab(0);  
    Container(getChildAt(0)).setStyle("closable", false);
    prerAddTabButton();
}  

private function doubleClickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation(); 
}

private function clickFunction(event:MouseEvent):void {  
    event.stopImmediatePropagation();  
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {  
        this.tabCreationAllowed = false;  
        this.addTab();  
        var $this:CustomTab = this;  
        setTimeout(function ():void {  
            $this.tabCreationAllowed = true;  
        }, 1500);  
    }  
}