0

Databinding without component ID

asked 2010-07-08 05:30:13 +0800

SHERKHAN gravatar image SHERKHAN
231 3

updated 2010-07-08 06:54:33 +0800

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

delete flag offensive retag edit

7 Replies

Sort by ยป oldest newest

answered 2010-07-08 07:29:26 +0800

tomCat gravatar image tomCat
276 3

updated 2010-07-08 07:30:32 +0800

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

link publish delete flag offensive edit

answered 2010-07-08 08:10:12 +0800

SHERKHAN gravatar image SHERKHAN
231 3

updated 2010-07-08 10:50:01 +0800

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

link publish delete flag offensive edit

answered 2010-07-08 10:54:40 +0800

SHERKHAN gravatar image SHERKHAN
231 3

updated 2010-07-08 10:56:34 +0800

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

link publish delete flag offensive edit

answered 2010-07-08 15:38:14 +0800

twiegand gravatar image twiegand
1807 3

SHERKHAN,

Do you still have the line:

<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="main" ?>

in your Zul file? If so, it will stop binding from working correctly if you are following the 2nd half of tomCat's example. Just remove it and try again...

Regards,

Todd

link publish delete flag offensive edit

answered 2010-07-09 03:06:25 +0800

SHERKHAN gravatar image SHERKHAN
231 3

updated 2010-07-09 03:06:51 +0800

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

link publish delete flag offensive edit

answered 2010-07-09 03:51:38 +0800

terrytornado gravatar image terrytornado flag of Germany
9393 3 7 16
http://www.oxitec.de/

updated 2010-07-09 03:51:52 +0800

Sherkan,

Please, can you post the IRC server-data /groupname ?

thx

link publish delete flag offensive edit

answered 2010-07-09 04:50:34 +0800

SHERKHAN gravatar image SHERKHAN
231 3

updated 2010-07-09 06:56:47 +0800

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

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2010-07-08 05:30:13 +0800

Seen: 698 times

Last updated: Jul 09 '10

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More