Zk从选定选项卡中删除事件侦听器

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

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

mainTab.getSelectedTab().addEventListener(Events.ON_CLOSE, new EventListener() { public void onEvent(Event event) throws Exception { event.stopPropogation(); showWarning(message); return; } }); 

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

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

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

如何从当前标签中删除监听器?

谁能解决我的问题?

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

这是一个有效的修复:

 public class Controller extends SelectorComposer { private static final EventListener EVENT_STOPPER = new EventListener() { 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")); } } 

这里的关键是在addEventListenerremoveEventListener使用相同的EventListener实例。

请注意,我们使用了private static final内部类,这只是保持对EventListener的引用的一种方法。 根据您的使用情况,还有其他方法。

基本上你可以调用tab.setClosable(false)来删除’x’(关闭按钮),如果你想要一个不能用’x’关闭的标签,你可以用setWidgetOverride来停止客户端的关闭动作

在下面的zul示例中,您可以将setWidgetOverride移动到您可以接收该选项卡实例的任何位置

      self.setWidgetOverride("_doCloseClick", "function(evt) { return; }");