2013-01-17 92 views
0

我有2個選項卡,其中一個是父項選項卡,另一個是子選項卡。我已經創建了父項選項卡,並將偵聽器動態地使用onClose事件添加到該選項卡,然後創建子選項卡。其實我想當用戶點擊Tab的關閉按鈕時,他不能關閉並獲取消息,所以我把event.stopPropogation()來處理關閉事件。在創建子選項卡之後,應該從父選項卡中刪除事件偵聽器。但是偵聽器不會從父選項卡中刪除。正如我使用removeEventlistener,但它也不起作用。Zk從選定的選項卡中移除事件監聽器

第一次我打電話給我添加事件監聽器到父項標籤的方法。

mainTab.getSelectedTab().addEventListener(Events.ON_CLOSE, 
       new EventListener<Event>() { 
        public void onEvent(Event event) throws Exception { 

    event.stopPropogation(); 
     showWarning(message); 
    return; 

} 
       }); 

然後創建所有的子選項卡後,我有這個listener.I我使用刪除...

mainTab.getSelectedTab().removeEventListener(Events.ON_CLOSE, 
        new EventListener<Event>() { 
         public void onEvent(Event event) throws Exception { 



    } 
        }); 

該偵聽器未在此選項卡上的工作,但是當我打開新的標籤頁(兄弟姐妹主選項卡),則不會調用監聽器。

如何從當前標籤中刪除監聽器?

任何人都可以解決我的問題嗎?

+0

我相信我明白你的問題,並會看看的解決方案的實例。但是,你可以請張貼你已經嘗試過的一些示例代碼。它會激發社區更多的興趣和理解,並且你更有可能得到你滿意的答案。乾杯。 –

回答

1

感謝這個例子,這對我有很大的幫助。 這裏的問題是在使用removeEventListener函數。該函數的第二個參數EventListener實例實際上是將被刪除的事件偵聽器。你可以在ZK源代碼中看到這個; removeEventListener函數在AbstractComponenton line 2140中執行,它檢查已知的EventListener哪個函數參數爲equals

這裏是一個工作的解決辦法:

public class Controller extends SelectorComposer<Window> { 

private static final EventListener<Event> EVENT_STOPPER = new EventListener<Event>() { 
    public void onEvent(Event event) throws Exception { 
     event.stopPropagation(); 
     System.out.println("Stopped propagation of " + event); 
    } 
}; 

@Wire 
private Tabbox mainTab; 

@Override 
public void doAfterCompose(Window comp) throws Exception { 
    super.doAfterCompose(comp); 
    addCloseEventStopper(); 
} 

@Listen(Events.ON_CLICK + " = #addTabsButton") 
public void addTabsButtonClicked() { 
    removeCloseEventStopper(); 
    addTabs(); 
} 

private void addCloseEventStopper() { 
    mainTab.getSelectedTab().addEventListener(Events.ON_CLOSE, EVENT_STOPPER); 
} 

private void removeCloseEventStopper() { 
    mainTab.getSelectedTab().removeEventListener(Events.ON_CLOSE, EVENT_STOPPER); 
} 

private void addTabs() { 
    Tabs tabs = mainTab.getTabs(); 
    tabs.appendChild(new Tab("Tab Two")); 
    tabs.appendChild(new Tab("Tab Three")); 
} 

} 

這裏的關鍵是,同樣EventListener實例在addEventListenerremoveEventListener使用。

注意這裏我們使用了一個privatestaticfinal內部類,這僅僅是一個的方式來留住一個EventListener參考。根據您的使用情況,還有其他方法。

+0

我正在做同樣的事情,但它不會從maintab.getSelectedtab中刪除監聽器。 你有其他解決方案嗎? – psisodia

+0

我不知道該告訴你什麼。我測試過這些代碼,它對我來說工作正常。你確定getSelectedTab正在返回你期望的Tab嗎?(請注意,實際的代碼可能不會依賴於'getSelectedTab'這種方式,因爲您將偵聽器添加到選定的選項卡,並稍後從選定的選項卡中刪除,但選擇可能已更改。) –

+0

感謝Benbai爲您但我必須在java類 – psisodia

0

基本上你可以調用tab.setClosable(false)去除'x'(關閉按鈕),如果你想讓一個選項卡不能用'x'關閉,你可以用setWidgetOverride

低於ZUL樣品,你可以移動setWidgetOverride的任何地方,你可以收到標籤

<zk> 
    <tabbox> 
     <tabs> 
      <tab label="unclosable tab" closable="true"> 
       <attribute name="onCreate"> 
        self.setWidgetOverride("_doCloseClick", "function(evt) { return; }"); 
       </attribute> 
      </tab> 
     </tabs> 
    </tabbox> 
</zk> 
+0

github上的Tab.js https://github.com/zkoss/zk/blob/master/zul/src/archive/web/js/zul/tab/Tab.js – benbai123