0

Tabs and Databind

asked 2010-02-02 08:31:22 +0800

TOtte gravatar image TOtte
93 2

Hi
I have multiple windows where I use <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>. This was working very well so far.
Now I want to integrate my windows into one page, where each of the windows is included into a tabpanel.
If I define the AnnotateDataBinderInit in each .zul before the window definition, then I get an exception "page is already covered by another Data Binder. Cannot be covered by this Data Binder again". If I initialize the DataBinder in the page that contains the tabs, then the Databinding tries to access all the fields, even if I am only working in one of the tabs and therefore I also run into exceptions.

Is there a good way to overcome this problem?

Thank you

delete flag offensive retag edit

3 Replies

Sort by » oldest newest

answered 2010-02-04 02:03:19 +0800

TOtte gravatar image TOtte
93 2

Thanks a lot for your answer robert!

I implementet the 3rd variant and it works well. I didn't really understand yet what you mean by "You have the first load manually (binder.loadAll()) - but could prepare the data before the firstload." What could I do there?

Thanks again
Tobias

link publish delete flag offensive edit

answered 2010-02-03 08:33:37 +0800

robertpic71 gravatar image robertpic71
1275 1

Hi,

Variant 1:
use absolute path's

Variant 2:
use relativ path

Check the API for the parameters for variant 1 + 2.

Variant 3:
Remove the XML-Tag and setup the binder inside the composer/controller.

..
AnnotateDataBinder binder;
...
public void doAfterCompose(Component comp) throws Exception {
   super.doAfterCompose(comp);
   binder = new AnnotateDataBinder(comp);
   binder.bindBean("controller", this); // optional, enables smarter syntax in zul
   binder.loadAll(); 

You have the first load manually (binder.loadAll()) - but could prepare the data before the firstload.

+ you own/know the binder-instance - this makes it more easy to perform an extra load and/or extra save
+ you can register your own names for the binder (e.g. controller or model for the model-tier)
--> value="@{win$composer.current.name}" becomes to value="@{controller.current.name}"
+ no path headache when the gui (vs. variant 1) is changing - every controller, owns his own binderinstance.

/Robert

link publish delete flag offensive edit

answered 2010-02-03 02:41:18 +0800

TOtte gravatar image TOtte
93 2

I am using ZK 5 if that matters for this problem.

The code of my main zul looks like this:

<zk>
<window title="Stammdatenpflege" border="normal">
	<tabbox>
		<tabs>
			<tab id="herstellerTab" label="Hersteller Stammdatenpflege"></tab>
			<tab id="StandortTab" label="Standorte Stammdatenpflege"></tab>
			<tab label="Mandanten Stammdatenpflege"></tab>
		</tabs>
		<tabpanels>
			<tabpanel><include src="HerstellerStammdatenpflege.zul"/></tabpanel>
			<tabpanel><include src="StandortStammdatenpflege.zul"/></tabpanel>
			<tabpanel></tabpanel>
		</tabpanels>
	</tabbox>
</window>
</zk>

There is no page definition right now, but I tried that, too.

Here is one of the pages that is supposed to be included in a tab.

<?page title="Stammdatenpflege - Hersteller" cacheable="false" 
	language="xul/html" zscriptLanguage="Java" contentType="text/html;charset=UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>
<window id="win" title="Stammdatenpflege - Hersteller" border="normal" apply="controller.HerstellerController">
 	<listbox id="box" multiple="true" rows="10" model="@{win$composer.alleHersteller, load-after='add.onClick, delete.onClick, update.onClick, nummer_intbox.onChange, name_textbox.onChange'}"
 		selectedItem="@{win$composer.current}">
 		<listhead>
 			<listheader label="Nummer"></listheader>
 			<listheader label="Name"></listheader>
 			<listheader label="Löschen"></listheader>
 		</listhead>
 		<listitem id="item" self="@{each='hersteller'}" value="@{hersteller}">
 		 	<listcell> <intbox id="nummer_intbox" value="@{hersteller.nummer}"/></listcell>
 			<listcell> <textbox id="name_textbox" value="@{hersteller.name}" /></listcell>
 			<listcell>
				<checkbox id="delete_checkbox" label="Löschen" />
			</listcell>
 		</listitem>
 	</listbox>
 	<groupbox mold="3d">
		<caption label="Hersteller" />
		Nummer: <intbox id="nummer" cols="25" value="@{win$composer.current.nummer}"></intbox>
		Name: <textbox id="name" cols="25" value="@{win$composer.current.name}"></textbox>
		<button id="add" label="Add" width="36px" height="24px"/>
		<button id="update" label="Update" width="46px" height="24px"/>
		<button id="delete" label="Delete" width="46px" height="24px"/>
	</groupbox>	
 </window>

Somebody got an idea how to solve this problem? I tried to find an example where both Tabs and Databinding are used and the sources are available?

Thanks

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-02-02 08:31:22 +0800

Seen: 1,019 times

Last updated: Feb 04 '10

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