-
FEATURED COMPONENTS
First time here? Check out the FAQ!
Hi guys. I am working with ZK Framework for a couple weeks now and it seems great. I am currently trying to convert the examples in ZK Essentials to fit my needs as I am in early stages and need a few CRUD screens. The problem here relates to the ZK Essentials/Displaying Information Using Grid, MVC and composite components/Composite Components in the MVC chapter.
I simply can't capture events posted programatically from a composite inside my controller. Here are a few excerpts from my code:
editComposite.zul
<zk> <button id="compositeButtonEdit" image="resources/icon/pencilpaper.png" /> </zk>
EditListcell.java
public class EditListcell extends Listcell implements IdSpace, AfterCompose { ... @Override public void afterCompose() { Executions.createComponents("/WEB-INF/composite/editComposite.zul", this, null); Selectors.wireVariables(this, this, null); Selectors.wireComponents(this, this, false); Selectors.wireEventListeners(this, this); } @Listen("onClick=#compositeButtonEdit") public void compositeButtonEdit() { System.out.println(">>>compositeButtonEdit click event fired"); Events.postEvent(this, new ItemEditEvent()); } // Customize Event public static final String ON_ITEM_EDIT = "onItemEdit"; public class ItemEditEvent extends Event { private static final long serialVersionUID = -462313777727415236L; public ItemEditEvent() { super(ON_ITEM_EDIT, EditListcell.this); } } }
EditListcell.java
public class EditListcell extends Listcell implements IdSpace, AfterCompose { ... @Override public void afterCompose() { Executions.createComponents("/WEB-INF/composite/editComposite.zul", this, null); Selectors.wireVariables(this, this, null); Selectors.wireComponents(this, this, false); Selectors.wireEventListeners(this, this); } @Listen("onClick=#compositeButtonEdit") public void compositeButtonEdit() { System.out.println(">>>compositeButtonEdit click event fired"); Events.postEvent(this, new ItemEditEvent()); } // Customize Event public static final String ON_ITEM_EDIT = "onItemEdit"; public class ItemEditEvent extends Event { private static final long serialVersionUID = -462313777727415236L; public ItemEditEvent() { super(ON_ITEM_EDIT, EditListcell.this); } } }
product.zul
<div apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('net.openrally.restaurant.webui.viewcontroller.ProductViewController')"> <tabbox id="contentTabBoxProduct" apply="net.openrally.restaurant.webui.controller.ProductController"> <tabs id="contentTabsProducts"> <tab id="contentTabList" label="List" /> <tab id="contentTabNew" label="New" /> <tab id="contentTabEdit" label="Edit" visible="false" /> </tabs> <tabpanels id="contentTabPanelsProduct"> <tabpanel id="contentTabPanelList"> <listbox id="contentListBoxProduct" model="@load(vm.productList)" selectedItem="@bind(vm.selectedItem)"> <listhead sizable="true"> <listheader label="Id" /> <listheader label="Name" /> <listheader label="Description" /> <listheader label="Price" /> <listheader align="center" /> </listhead> <template name="model" var="product"> <listitem> <listcell label="@load(product.productId)" /> <listcell label="@load(product.name)" /> <listcell label="@load(product.description)" /> <listcell label="@load(product.price)" /> <editCell editableEntity="${product}" /> <listcell> <button image="resources/icon/trash.png" onClick="@command('deleteProduct', product=product)" /> </listcell> </listitem> </template> </listbox> </tabpanel> ... </tabpanels> </tabbox> </div>
ProductController.java
public class ProductController extends SelectorComposer<Tabbox> { private static final long serialVersionUID = -7186783182440309573L; ... @Listen("onClick") public void onClickV1(Event event) { System.out.println(">>>onClickV1 fired"); } @Listen("onItemEdit=button") public void onItemEditV1(Event event) { System.out.println(">>>onItemEditV1 fired"); } @Listen("onItemEdit=tabbox#contentTabBoxProduct") public void onItemEditV2(Event fe) { System.out.println(">>>onItemEditV2 fired"); } @Listen("onItemEdit=tabbox#contentTabBoxProduct #contentTabPanelsProduct #contentTabPanelList #contentListBoxProduct listitem editCell") public void onItemEditV3(Event fe) { System.out.println(">>>onItemEditV3 fired"); } @Listen("onItemEdit=tabbox#contentTabBoxProduct tabpanels tabpanel listbox listitem editCell") public void onItemEditV4(Event fe) { System.out.println(">>>onItemEditV4 fired"); } ... }
ProductViewController.java
public class ProductViewController { private Product selectedItem; public Product getSelectedItem() { return selectedItem; } public void setSelectedItem(Product selectedItem) { this.selectedItem = selectedItem; } public List<Product> getProductList() { return generateProducts(); } ... @GlobalCommand @NotifyChange("productList") public void updateProductList() { } }
As you can see, I tried binding listeners in my controller using several flavors of Listen annotations. None of them worked. On the other hand, the click event from EditListcell is fired as I can see it's message in my console. I think I am missing something simple here, any or suggestion is appreciated.
If there is any missing code that you would like to see, let me know and I will post it here, or feel free to take a look at my github repository
Thank you all in advance.
Hi all. After researching some more time and still not finding a solution, I decided to cease my development with ZK Framework.
It is certainly a good framework, but not being able to overcome a problem like this in early development stages was a blocker issue.
I wish success and all the best for ZK developers and maintainers.
You can use @Command
in your java code as well in your ZUL Page to fire a Event. As you are using MVVM Architecture.
See Java Code method
@Command
public void valueChangedListner(
@BindingParam("taskListObject") TaskListData changedObject) {
changedModel.add(changedObject);
}
and in my ZUL i called this method like this.
<intbox value="@bind(taskListData.processPriority)" inplace="true" onChange="@command('valueChangedListner',taskListObject = taskListData)">
</intbox>
Here i am passing object in onChange and this object will be get into java Method by
@BindingParam("taskListObject") TaskListData changedObject
I found a way to forward events to the composite component itself, and handle this events in the controller. However, I submitted a request at http://tracker.zkoss.org/browse/ZK-1598.
My component's ZUL mySelect.zul:
<?xml version="1.0" encoding="UTF-8"?>
<zk>
<label id="lb" value="asdf" />
<combobox id="cb">
<comboitem label="a" />
<comboitem label="b" />
</combobox>
</zk>
My component's Java file: public class MySelect extends Hbox implements IdSpace {
public MySelect() {
// 1. Render the template
Executions.createComponents("/mySelect.zul", this, null);
// 2. Wire variables, components and event listeners (optional)
Selectors.wireVariables(this, this, null);
Selectors.wireComponents(this, this, false);
Selectors.wireEventListeners(this, this);
}
@Listen("onSelect = #cb")
public void onCh(Event evt){
System.out.println("MySelect.onCH() - " + this.getId());
// Always null, why?
System.out.println(
this.getPage().getDesktop().getComponentByUuidIfAny("this.getId()"));
// Workaround
Component target = null;
for (Component c : this.getPage().getDesktop().getComponents()){
if (c.getId().equals(this.getId())){
System.out.println("forward");
target = c;
}
}
if (target != null)
Events.sendEvent(target, evt);
}
}
My ZUL page that where I use the component:
<?component name="mySelect" extends="hbox" class="composite.MySelect" ?>
<?page id="wfPage" ?>
<window title="TestData window" border="normal" width="300px" apply="controller.TestController"
id="wfWindow">
<mySelect id="wfS" />
</window>
The controller for the page:
public class TestController extends GenericForwardComposer<Component> {
public void onSelect$wfS(Event evt){
alert("TestController.onSelect$wfS() - " + evt.getName() + " - " + evt.getData());
}
}
@Override
public void afterCompose() {
super.doAfterCompose();
....
}
isn't it?
Asked: 2012-06-08 03:10:03 +0800
Seen: 239 times
Last updated: Jan 28 '13