我刚刚开始学习ZK,并且我遇到了一个严重的问题,即从包含多个菜单和菜单项的父菜单栏中拦截事件(onClick)。
我正在使用 AJAX 更改内部面板的 src uri。
我不想为每个菜单项创建一个唯一的类。
我想(但我不知道是否以及如何可能)创建一个类来拦截菜单栏中的 onClick 事件,但是当此类事件实际上出现在菜单项上时。
所以我想将类 Controller 绑定(bind)到菜单栏,但同时获取用户单击的菜单项。
这是我的代码:
索引.zul
<zk>
<style>.z-menubar-hor, .z-menubar-ver { border: 1px solid #D8D8D8; }
.content {overflow-x: hidden;overflow-y: scroll;}</style>
<borderlayout hflex="1" vflex="1" id="mainBorder">
<north>
<include src="topBanner.zul"/>
</north>
<west>
<panel hflex="1" vflex="1" border="normal" title="MENU COMANDI" apply="mainPage.MenuAjaxbasedController">
<panelchildren style="padding:5px;">
<menubar id="menubar" orient="vertical" autodrop="true">
<menu label="ANAGRAFICA" id="anagrafica">
<menupopup>
<menuitem id="contatti" label="CONTATTI" />
<menuitem id="listeDiDistribuzione" label="LISTE DISTRIBUZIONE" />
<menuitem id="sottoscrizioni" label="SOTTOSCRIZIONI" />
<menuitem id="profilo" label="PROFILO" />
</menupopup>
</menu>
<menu label="MESSAGGI">
<menupopup>
<menuitem id="nuovaNewsletter" label="NUOVA NEWSLETTER" />
<menuitem id="messaggiInviati" label="MESSAGGI INVIATI" />
<menuitem id="bozze" label="BOZZE" />
</menupopup>
</menu>
<menu label="STRUMENTI">
<menupopup>
<menuitem id="smtpServers" label="SMTP SERVERS" />
</menupopup>
</menu>
</menubar>
</panelchildren>
</panel>
</west>
<center id="mainContent" autoscroll="true" border="none">
<include id="mainContentInclude" self="@define(content)" src=""/>
</center>
<south>
<include src="bottomFooter.zul"/>
</south>
</borderlayout>
MenuAjaxBasedController.java
public class MenuAjaxbasedController extends SelectorComposer<Component>{
private static final long serialVersionUID = 1L;
@Wire
Center mainContent;
@Wire
Borderlayout mainBorder;
@Wire
Menuitem contatti;
@Wire
Include mainContentInclude;
@Wire
Menubar menubar;
@Listen("onClick = #contatti")
public void change_page(Event e){
// Menubar mb = (Menubar) e.getTarget();
System.out.println(e.getTarget());
String locationUri = "anagraficaContattiMainGrid.zul";
// alert("menu link test");
Include include = (Include)Selectors.iterable(mainBorder.getPage(), "#mainContentInclude").iterator().next();
include.setSrc(locationUri);
}
}
如您所见,我现在只听一个菜单项。
非常感谢并致以最诚挚的问候。
最佳答案
我想到了两种方法..
使用 ZK 绑定(bind)
使用ZK's @Listen
approach ,您可以通过用分号 (;
) 分隔事件,使用单个监听器监听多个事件。
例如:
@Listen("onClick = #contatti; onClick = #listeDiDistribuzione; onClick = #sottoscrizioni")
public void changePage(Event event) {
event.getTarget(); // the specific button clicked
}
当您注意到 these are just CSS selectors 时,可以将其清理。 :
@Listen("onClick = #menubar ~ menuitem")
public void changePage(Event event) {
event.getTarget(); // the specific button clicked
}
这里有很多的可能性,阅读文档(上面链接),你会想出一些好的东西。
挥杆风格
解决此问题的另一种方法是从 Java 端执行此操作。这非常像 Swing,并且 View 之间的分离并不那么清晰,但完全有效且值得一提。
private static final EventListener<Event> LISTENER = new EventListener<Event>() {
@Override
public void onEvent(Event event) {
event.getTarget(); // the specific button clicked
}
}
@Wire
private Menuitem contatti;
@Wire
private Menuitem listeDiDistribuzione;
@Override
public void doAfterCompose(Component component) {
contatti.addEventListener(Events.ON_CLICK, LISTENER);
listeDiDistribuzione.addEventListener(Events.ON_CLICK, LISTENER);
}
当然,在这里你也可以通过一些 CSS 选择来简化事情..
@Wire("#menubar ~ menuitem")
private List<Menuitem> menuitems;
@Override
public void doAfterCompose(Component component) {
for (Menuitem menuitem : menuitems) {
menuitem.addEventListener(Events.ON_CLICK, LISTENER);
}
}
StackOverflow 中的 Benvenuto。
关于java - ZK:如何拦截/使用父菜单栏中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715671/