2012-05-01 30 views
0

У меня есть TabNavigator, который я пытаюсь сделать как Firefox, поскольку последняя вкладка - специальная вкладка «+», которая добавляет новую вкладку в элемент управления. Для этого я добавляю обработчик событий к самой первой вкладке, которую я получаю с помощью tabNavigator.getTabAt(0).addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false). Я установил приоритет int.MAX_VALUE, поэтому мой метод должен быть первым, который называется, а затем может остановить других обработчиков, вызванных с помощью stopImmediatePropagation().Flex TabNavigator Tab Кнопки не срабатывают Нажмите Событие

Моя проблема заключается в том, что время от времени мой обработчик клика не вызывается, и вместо этого выполняется обычная логика, а вкладка «+» переключается на.

Код для 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); 
    } 
} 
+0

Если он работает, как в Firefox, то вкладки будут добавлены к левой вкладке (перед) «+», который может приращения индекса этой вкладки в 'tabNavigator'. Итак, чтобы получить вкладку «+», вам придется использовать 'tabNavigator.getTabAt (1)'. Возможно ли, что это происходит? Если нет, можете ли вы опубликовать некоторый исходный код? – Travesty3

+0

Мой код не должен иметь этой проблемы, хотя это идея, которую я имел. Проблема в том, что тогда это никогда не сработает, сейчас это несколько раз работает. Я опубликовал более полный код. – shmuelie

+0

Как добавить вкладку «переключиться на» к вкладкам? Вместо того, чтобы полагаться на остановку события, возможно, просто не добавляйте этот прослушиватель событий на вкладку «+». – Travesty3

ответ

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); 
    } 
}