我有2个选项卡,一个是Parent选项卡,另一个是子选项卡。我创建了Parent选项卡,并使用onClose事件将侦听器动态地添加到它,然后创建子选项卡。实际上我想要当用户点击Tab的关闭按钮时,他无法关闭并获取消息,所以我将event.stopPropogation()用于处理close事件。创建子选项卡后,应从父选项卡中删除事件侦听器。但是侦听器不会从父选项卡中删除。因为我正在使用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 {
}
});
此侦听器无法在此选项卡上运行,但是当我打开新选项卡(主选项卡的同级)时,不会调用侦听器。
如何从当前标签中删除监听器?
任何人都可以解决我的问题吗?
答案 0 :(得分:1)
感谢这个例子,这有很大帮助。
这里的问题在于使用removeEventListener
函数。函数的第二个参数EventListener
实例,实际上是将被删除的 exact 事件侦听器。你可以在ZK源代码中看到这个; removeEventListener
函数在AbstractComponent
和on 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
和addEventListener
使用了相同的removeEventListener
实例。
请注意,我们使用了private
static
final
内部类,这只是保持对EventListener
的引用的一种方法。根据您的使用情况,还有其他方法。
答案 1 :(得分:0)
基本上你可以调用tab.setClosable(false)来删除'x'(关闭按钮),如果你想要一个不能用'x'关闭的标签,你可以用setWidgetOverride <停止客户端的关闭动作/ p>
下面的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>