0

我有 2 个选项卡,一个是父选项卡,另一个是子选项卡。我创建了父选项卡并使用 onClose 事件动态地将侦听器放入它,然后创建子选项卡。实际上,我希望当用户单击 Tab 的关闭按钮时,他无法关闭并获取消息,因此我将 event.stopPropogation() 用于处理关闭事件。创建子选项卡后,应从父选项卡中删除事件侦听器。但侦听器不会从父选项卡中删除。因为我正在使用 removeEventlistener 但它也不起作用。

我第一次调用一个方法,在该方法中我将事件侦听器添加到父选项卡。

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

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

}
                });

然后在创建所有子选项卡后,我必须删除此侦听器。我正在使用...

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



    }
                    });

此侦听器不在此选项卡上工作,但是当我打开新选项卡(主选项卡的兄弟)时,不会调用侦听器。

如何从当前选项卡中删除监听器?

谁能解决我的问题?

4

2 回答 2

1

感谢您的示例,这很有帮助。这里的问题在于removeEventListener函数的使用。函数的第二个参数,一个EventListener实例,实际上是将被删除的确切事件侦听器。您可以在 ZK 源代码中看到这一点;该removeEventListener函数在第 2140 行AbstractComponent实现,它检查已知的函数参数。EventListenerequals

这是一个有效的修复:

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

注意这里我们使用了一个private static final内部类,这只是保持对EventListener. 根据您的用例,还有其他方法。

于 2013-01-17T13:30:19.503 回答
0

Basically you can call tab.setClosable(false) to remove the 'x' (close button), if you want make a tab not closable with the 'x', you can stop the close action from client side with setWidgetOverride

a zul sample below, you can move setWidgetOverride to anywhere that you can receive instance of that tab

<zk>
    <tabbox>
        <tabs>
            <tab label="unclosable tab" closable="true">
                <attribute name="onCreate">
                    self.setWidgetOverride("_doCloseClick", "function(evt) { return; }");
                </attribute>
            </tab>
        </tabs>
    </tabbox>
</zk>
于 2013-01-18T00:51:21.457 回答