-
FEATURED COMPONENTS
First time here? Check out the FAQ!
Hi all,
I would like create a lot of windows in same time... Each window has a composer. But each window has to use databinding.
I use spaceOwner$composer instead of myWinId$composer... But it doesn't work... The window is created but the textboxes are empty...
If I used an Id instead of spaceOwner as before (but I can only create one window), it works perfectly...
My zul file :
<?page id="employeeForm" title="Employee form" cacheable="false" language="xul/html" zscriptLanguage="Java"?> <?meta content="text/html; charset=UTF-8" pageEncoding="UTF-8"?> <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="" ?> // before I put root="myWinID" <window closable="true" minimizable="true" minimized="false" maximizable="true" sizable="true" height="500px" width="400" contentStyle="overflow:auto" apply="org.chorem.bonzoms.ui.EmployeeFormController"> <caption label="Employee addition"/> <groupbox> <caption label="Employee informations" /> <hbox> <vbox> <label value="email" /> <textbox value="@{spaceOwner$composer.employee.email, save-when='self.onChange'}" /> <label value="Phone number" /> <textbox value="@{spaceOwner$composer.employee.workingPhone, save-when='self.onChange'}" /> </vbox> <groupbox> <caption label="Working address" /> <vbox> <label value="Adress1" /> <textbox value="@{spaceOwner$composer.workingAddress.address1, save-when='self.onChange'}" /> <label value="Adress2" /> <textbox value="@{spaceOwner$composer.workingAddress.address2, save-when='self.onChange'}" /> <label value="Zip code" /> <textbox value="@{spaceOwner$composer.workingAddress.zipCode, save-when='self.onChange'}" /> <label value="City" /> <textbox value="@{spaceOwner$composer.workingAddress.city, save-when='self.onChange'}" /> <label value="Country" /> <textbox value="@{spaceOwner$composer.workingAddress.country, save-when='self.onChange'}" /> </vbox> </groupbox> </hbox> </groupbox> <groupbox> <caption label="Personnal informations" /> <hbox> <vbox> <label value="First name" /> <textbox value="@{spaceOwner$composer.employee.firstName, save-when='self.onChange'}" /> <label value="Last name" /> <textbox value="@{spaceOwner$composer.employee.lastName, save-when='self.onChange'}" /> <label value="Birthday" /> <datebox value="@{spaceOwner$composer.employee.birthDay, save-when='self.onChange'}" /> <label value="Email" /> <textbox value="@{spaceOwner$composer.employee.email, save-when='self.onChange'}" constraint="/.+@.+\.+/" /> <hbox> <button label="Add address " id="addAddress" /> <button label="Delete address" id="deleteAddress" /> </hbox> </vbox> <listbox id="addressListbox" model="@{spaceOwner$composer.addressesModel}" width="200px"> <listitem self="@{each='address'}"> <listcell> <groupbox> <caption label="Adress" /> <vbox> <label value="Adress1" /> <textbox value="@{address.address1, save-when='self.onChange'}" /> <label value="Adress2" /> <textbox value="@{address.address2, save-when='self.onChange'}" /> <label value="Zip code" /> <textbox value="@{address.zipCode, save-when='self.onChange'}" /> <label value="City" /> <textbox value="@{address.city, save-when='self.onChange'}" /> <label value="Country" /> <textbox value="@{address.country, save-when='self.onChange'}" /> </vbox> </groupbox> </listcell> </listitem> </listbox> </hbox> <groupbox width="330px"> <caption label="Phones" /> <listbox id="phoneListbox" model="@{spaceOwner$composer.phonesModel}" width="310px"> <listhead sizable="true"> <listheader label="Name" /> <listheader label="Phone Number" /> </listhead> <listitem self="@{each='phone'}"> <listcell> <textbox value="@{phone.name, save-when='self.onChange'}" /> </listcell> <listcell> <textbox value="@{phone.number, save-when='self.onChange'}" /> </listcell> </listitem> </listbox> </groupbox> <button label="Add phone " id="addPhone" /> <button label="Delete phone" id="deletePhone" /> </groupbox> <button id="addEmployee" label="Add" /> </window>
Thanks for your help,
Regards,
SHERKHAN
Hi Sherkhan,
you can set an attribute containing your controller inside your doAfterCompose method.
For example:
SpaceOwnerComposer.java
public class SpaceOwnerComposer extends GenericForwardComposer { private String test = "Hello world!!!!"; @Override public void doBeforeComposeChildren(Component comp) throws Exception { // TODO Auto-generated method stub super.doBeforeComposeChildren(comp); } /* (non-Javadoc) * @see org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.zk.ui.Component) */ @Override public void doAfterCompose(Component comp) throws Exception { // TODO Auto-generated method stub super.doAfterCompose(comp); comp.setAttribute("spaceOwnerComposer", this, Component.SPACE_SCOPE); } public void setTest(String test) { this.test = test; } public String getTest() { return test; } }
index.zul:
<?page title="new page title" contentType="text/html;charset=UTF-8"?> <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main" ?> <zk> <window id="main"> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{spaceOwnerComposer.test}" /> </window> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{spaceOwnerComposer.test}" /> </window> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{spaceOwnerComposer.test}" /> </window> </window> </zk>
On the other hand i prefer to create the DataBinder inside my controller for each window. So every window has its own DataBinder. You can then also set your bean definitions for your DataBinder inside your controller.
For example:
SpaceOwnerComposer.java
public class SpaceOwnerComposer extends GenericForwardComposer { private String test = "Hello world!!!!"; /* (non-Javadoc) * @see org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.zk.ui.Component) */ @Override public void doAfterCompose(Component comp) throws Exception { // TODO Auto-generated method stub super.doAfterCompose(comp); DataBinder binder = new AnnotateDataBinder(comp); binder.bindBean("test", test); binder.loadAll(); } }
index.zul:
<?page title="new page title" contentType="text/html;charset=UTF-8"?> <zk> <window> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{test}" /> </window> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{test}" /> </window> <window title="new page title" border="normal" apply="controller.SpaceOwnerComposer"> <textbox value="@{test}" /> </window> </window> </zk>
I hope this helps.
Best regards,
tom
Hi tom,
Thanks for your help, I think it is what I want!
But I have a question: <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main" ?> only bind the window or all the elements contained in the composer too? So in my case I can just do :
public void doAfterCompose(Component comp) throws Exception { // TODO Auto-generated method stub super.doAfterCompose(comp); DataBinder binder = new AnnotateDataBinder(comp); binder.bindBean("composer", this); binder.loadAll(); }
or I have for each composer attribute create a databinder? Can you explain me these 3 lines please :
DataBinder binder = new AnnotateDataBinder(comp); binder.bindBean("composer", this); binder.loadAll();
thanks for all your help,
Best regards,
SHERKHAN
I have a problem :
public void doAfterCompose(Component comp) throws Exception { // TODO Auto-generated method stub super.doAfterCompose(comp); DataBinder binder = new AnnotateDataBinder(comp); binder.bindBean("employee", employee); binder.bindBean("address", address); binder.loadAll(); }
Zul:
<window apply="myComposer"> <vbox> <label value="email" /> <textbox value="@{employee.email, save-when='self.onChange'}" /> <label value="Phone number" /> <textbox value="@{employee.workingPhone, save-when='self.onChange'}" /> </vbox> <groupbox> <caption label="Working address" /> <vbox> <label value="Adress1" /> <textbox value="@{address.address1, save-when='self.onChange'}" /> <label value="Adress2" /> <textbox value="@{address.address2, save-when='self.onChange'}" /> </vbox> </groupbox> </window>
The textboxes are not filled... And it should be?
Thanks for your help,
Regards
SHERKHAN
SHERKHAN,
Do you still have the line:
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main" ?>
Regards,
Todd
Hi Todd.
Yes i have removed this line :
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main" ?>
But in my case employee and address are set in doAfterCompose (arg.get("employee") and arg.get("address")) so maybe it uses the empty employee and address...
Thanks for your help,
best regards,
SHERKHAN
Sherkan,
Please, can you post the IRC server-data /groupname ?
thx
Hi Stephan,
You can find all you need at : http://www.zkoss.org/Community/irc.dsp (maybe see you on zk channel !)
I find out the problem :
I did arg.get("employee") and set employer after binding the element ... Now it works!
Best regards,
SHERKHAN
Asked: 2010-07-08 05:30:13 +0800
Seen: 698 times
Last updated: Jul 09 '10