|
From: <sim...@us...> - 2011-09-24 14:45:03
|
Revision: 1117
http://zkforge.svn.sourceforge.net/zkforge/?rev=1117&view=rev
Author: simon_massey
Date: 2011-09-24 14:44:54 +0000 (Sat, 24 Sep 2011)
Log Message:
-----------
Better documentation around the Model-View-Binder (MVB) aka Model-View-ViewModel (MVVM) with ZK RIA Ajax Java.
Modified Paths:
--------------
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/DateFormatConverter.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/Reminder.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ReminderService.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV1.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV2.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModel.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModelImpl.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinder.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinderInit.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandConverter.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/InputEventCommandConverter.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/Station.java
trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/WeathStationViewModel.java
trunk/zktodo2/src/main/webapp/index.jsp
trunk/zktodo2/src/main/webapp/mvvm-demo/weather-station-mvvm.zul
trunk/zktodo2/src/main/webapp/zktodo_a.zul
trunk/zktodo2/src/main/webapp/zktodo_b.zul
trunk/zktodo2/src/main/webapp/zktodo_c.zul
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/DateFormatConverter.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/DateFormatConverter.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/DateFormatConverter.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import java.util.Date;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/Reminder.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/Reminder.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/Reminder.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import java.util.Date;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ReminderService.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ReminderService.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ReminderService.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -5,6 +5,9 @@
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
public class ReminderService {
protected BasicDao basicDao;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV1.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV1.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV1.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import static java.lang.System.out;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV2.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV2.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoControllerV2.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import static java.lang.System.out;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModel.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModel.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModel.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import java.util.List;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModelImpl.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModelImpl.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoModelImpl.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
import java.util.List;
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/ZkToDoViewModel.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,5 +1,9 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2;
+import java.util.Date;
import java.util.List;
public class ZkToDoViewModel {
@@ -51,11 +55,30 @@
}
}
}
-
+
public void add() {
if( this.selectedReminder.getId() == null ){
this.reminderService.persist(this.selectedReminder);
this.selectedReminder = new Reminder();
}
}
+
+ /**
+ * The following date method can be called by binder in response to
+ *
+ * <datebox id="date"
+ * onChange="@{toDoViewModel, converter='org.zkforge.zktodo2.binding.InputEventCommandConverter'}"/>
+ *
+ * It therefore demonstrates that CommandBinder can use a converter to
+ * pass state known by the View down to the ViewModel.
+ *
+ * As it is our View input components are bound to the properties of the
+ * ViewModel.seletectedReminder detached JPA entity; so we don't need to be
+ * passed such state. But for the sake of making an example this vaguely
+ * named method which does nothing shows how you would have components which
+ * are not bound to any Model pass data down into the ViewModel
+ */
+ public void date(Date date ){
+ System.out.println("The date has changed to "+date);
+ }
}
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinder.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinder.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinder.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/**
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+*/
package org.zkforge.zktodo2.binding;
import java.lang.reflect.Method;
@@ -6,6 +9,21 @@
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
+/**
+ * CommandBinder bind events such as "onClick"/"onChange" onto a POJO business object.
+ *
+ * An optional converter class can be specified. The converter bridges the View world of the
+ * onX Event into the POJO business world. This is because we don't want the POJO business
+ * object to be compiled against the ZK view classes.
+ *
+ * See the presentation at {@link http://dl.dropbox.com/u/2622674/zk/zk-mvvm.pdf}
+ * for more information about the Model-View-Binder (MVB) pattern (also know as the
+ * Model-View-View-Model (MVVM) pattern.
+
+ * @see org.zkforge.zktodo2.binding.CommandBinderInit
+ * @see org.zkforge.zktodo2.binding.CommandConverter
+ * @author simon
+ */
public class CommandBinder {
public CommandBinder(Component comp, String eventName, final Object target, String methodName, final CommandConverter converter) {
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinderInit.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinderInit.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandBinderInit.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/**
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+*/
package org.zkforge.zktodo2.binding;
import java.util.Iterator;
@@ -13,6 +16,19 @@
import org.zkoss.zkplus.databind.DataBinder;
/**
+ * This class resolves annotations such as onClick="@{targetBean}" and creates a
+ * CommandBinder which maps a method on the target bean to an event handler on the
+ * annotated component. The "id" of the component is used as the method name to invoke
+ * on the target bean.
+ *
+ * There can be an optional converter such as
+ *
+ * <datebox id="date"
+ * onChange="@{toDoViewModel, converter='org.zkforge.zktodo2.binding.InputEventCommandConverter'}"/>
+ *
+ * If a converter is specified then the method coerceToModelParameters will be called
+ * which can resolve the business objects to pass into the method of the target bean.
+ *
* AnnotateDataBinderInit and AnnotateDataBinder have private rather than protected
* methods so are not extensible. This class therefore has some cut and paste from
* those classes.
@@ -48,7 +64,11 @@
}
/**
- * The logic to resolve the component follows the logic documented for AnnotateDataBinderInit
+ * The logic to resolve the component follows the logic documented for AnnotateDataBinderInit.
+ * You can pass the name of the component to scan for annotations to speed up page loading:
+ *
+ * <?init class="org.zkforge.zktodo2.binding.CommandBinderInit" root="./buttons"?>
+ *
*/
public void doAfterCompose(Page page, Component[] components) throws Exception {
if( root == null ){
@@ -88,8 +108,8 @@
protected void loadComponentPropertyAnnotationByAnnotName(Component comp,
String annotName) {
- String id = comp.getId();
- if (id == null && "".equals(id)) {
+ String methodName = comp.getId();
+ if (methodName == null && "".equals(methodName)) {
return;
}
ComponentCtrl compCtrl = (ComponentCtrl) comp;
@@ -100,15 +120,15 @@
for (@SuppressWarnings("unchecked")
final Iterator it = props.iterator(); it.hasNext();) {
- final String propName = (String) it.next();
+ final String eventName = (String) it.next();
- if (propName.startsWith("on") ) {
+ if (eventName.startsWith("on") ) {
final Object[] annotationDetails = loadPropertyAnnotation(comp,
- propName, annotName);
+ eventName, annotName);
String targetName = (String) annotationDetails[0];
- final Object variable = page.getXelVariable(targetName);
+ final Object target = page.getXelVariable(targetName);
CommandConverter converter = null;
@@ -126,7 +146,7 @@
}
}
- new CommandBinder(comp, propName, variable, id, converter);
+ new CommandBinder(comp, eventName, target, methodName, converter);
}
}
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandConverter.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandConverter.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/CommandConverter.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/**
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+*/
package org.zkforge.zktodo2.binding;
import java.lang.reflect.Method;
@@ -4,6 +7,15 @@
import org.zkoss.zk.ui.event.Event;
+/**
+ * CommandConverter can be used to bridge the intentional divide between
+ * the POJO business object (i.e. ViewModel) and the ZK framework. The
+ * event can be used to resolve business state held within the ZK desktop
+ * (i.e. the View) which is returned as an array list of arguments which
+ * will be invoked on the specified method of the ViewModel.
+ *
+ * @author simon
+ */
public interface CommandConverter {
Object[] coerceToModelParameters( Event e, Method m );
}
\ No newline at end of file
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/InputEventCommandConverter.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/InputEventCommandConverter.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/binding/InputEventCommandConverter.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,3 +1,6 @@
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
package org.zkforge.zktodo2.binding;
import java.lang.reflect.Method;
@@ -5,10 +8,11 @@
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.InputEvent;
+import org.zkoss.zkplus.databind.TypeConverter;
import org.zkoss.zul.api.Datebox;
import org.zkoss.zul.api.Intbox;
-public class InputEventCommandConverter implements CommandConverter {
+public class InputEventCommandConverter implements CommandConverter, TypeConverter {
public Object[] coerceToModelParameters(Event e, Method m) {
Component target = e.getTarget();
@@ -27,4 +31,12 @@
return new Object[]{data};
}
+ public Object coerceToBean(Object val, Component comp) {
+ return TypeConverter.IGNORE;
+ }
+
+ public Object coerceToUi(Object val, Component comp) {
+ return TypeConverter.IGNORE;
+ }
+
}
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/Station.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/Station.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/Station.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -4,6 +4,9 @@
import java.util.GregorianCalendar;
import java.util.Random;
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
public class Station {
private String name = "";
private Date date = new Date();
Modified: trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/WeathStationViewModel.java
===================================================================
--- trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/WeathStationViewModel.java 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/java/org/zkforge/zktodo2/mvvm/demo/WeathStationViewModel.java 2011-09-24 14:44:54 UTC (rev 1117)
@@ -3,6 +3,9 @@
import java.util.ArrayList;
import java.util.List;
+/*
+ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html
+ */
public class WeathStationViewModel {
public WeathStationViewModel(){
Modified: trunk/zktodo2/src/main/webapp/index.jsp
===================================================================
--- trunk/zktodo2/src/main/webapp/index.jsp 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/webapp/index.jsp 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,6 +1,15 @@
-Click <a href="zktodo_a.zul">here</a> for the original MVP version of the zul from the <a href="http://www.zkoss.org/smalltalks/mvc4/">mvc4 article</a>.
<br/>
-Click <a href="zktodo_b.zul">here</a> for the databindings MVC version of the zul with an explicit model class.
+Click <a href="zktodo_c.zul">here</a> for the MVB aka MVVM version based on the appraoch
+presented at the
+<a href="http://dl.dropbox.com/u/2622674/zk/zk-mvvm.pdf">2010 UK ZK Users Group</a>.
<br/>
-Click <a href="zktodo_c.zul">here</a> for the MVVM version.
-
+<br/>
+Click <a href="zktodo_b.zul">here</a> for the databindings MVC version of the zul with an explicit model class
+which was written up in the <a href="http://java.dzone.com/articles/using-desktop-model-view">Using Desktop MVC Patterns with ZK, Spring & JPA</a>
+<br/>
+<br/>
+Click <a href="zktodo_a.zul">here</a> for the original MVP version of the zul from the original article <a href="http://books.zkoss.org/wiki/Small%20Talks/2008/November/ZK%20With%20Spring%20JPA%20And%20A%20Model-View-Controller%20Pattern">ZK With Spring JPA And A Model-View-Controller Pattern</a>.
+<br/>
+<br/>
+Click <a href="mvvm-demo/weather-station-mvvm.zul">here</a> for the weather station MVVM demo which is mentioned in the presentation at the link above.
+
\ No newline at end of file
Modified: trunk/zktodo2/src/main/webapp/mvvm-demo/weather-station-mvvm.zul
===================================================================
--- trunk/zktodo2/src/main/webapp/mvvm-demo/weather-station-mvvm.zul 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/webapp/mvvm-demo/weather-station-mvvm.zul 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<?page title="Weather Station MVVM Demo - Inspired By "?>
+<!-- ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html -->
+<?page title="Weather Station MVVM Demo"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<?init class="org.zkforge.zktodo2.binding.CommandBinderInit" root="./buttons"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver" ?>
@@ -13,7 +14,7 @@
.z-intbox-disd, .z-intbox-disd * { color: black !important; background: #fff !important;}
.z-textbox-disd, .z-textbox-disd * { color: black !important; background: #fff !important;}
</style>
- <window title="Databindings, Statebindings & CommandBindings" width="640px" border="normal">
+ <window title="Model-View-Binder (MVB) aka MVVM with Databindings, Statebindings & CommandBindings" width="640px" border="normal">
<hbox width="100px">
<div width="200px">
@@ -54,7 +55,7 @@
<checkbox id="confirmedCheckbox" checked="@{testBean.station.confirmed, load-after='create.onClick'}" />
</row>
<row id="buttons">
- <div>
+ <div>
</div>
<div>
<button id="create" label="New" onClick="@{testBean}"/>
@@ -64,5 +65,6 @@
</rows>
</grid>
</hbox>
+ <label value="This was inspired by Martin Fowler's Weather Station example at http://martinfowler.com/eaaDev/uiArchs.html"/>
</window>
</zk>
Modified: trunk/zktodo2/src/main/webapp/zktodo_a.zul
===================================================================
--- trunk/zktodo2/src/main/webapp/zktodo_a.zul 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/webapp/zktodo_a.zul 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html -->
<?page title="ZkTodo2 - MVP Example"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<zk xmlns="http://www.zkoss.org/2005/zul">
-<window title="To Do List" width="640px" border="normal" apply="${toDoControllerV1}">
+<window title="To Do List :: Model-View-Presenter (MVP)" width="640px" border="normal" apply="${toDoControllerV1}">
<listbox id="list" multiple="true" rows="12">
<listhead>
<listheader label="Item" />
Modified: trunk/zktodo2/src/main/webapp/zktodo_b.zul
===================================================================
--- trunk/zktodo2/src/main/webapp/zktodo_b.zul 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/webapp/zktodo_b.zul 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
+<!-- ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html -->
<?page title="ZkTodo2 - MVC Example"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<zk xmlns="http://www.zkoss.org/2005/zul">
-<window title="To Do List" width="640px" border="normal" apply="${toDoControllerV2}">
+<window title="To Do List :: Model-View-Controller" width="640px" border="normal" apply="${toDoControllerV2}">
<listbox id="list" multiple="true" rows="12" model="@{toDoModel.reminders}" selectedItem="@{toDoModel.selectedReminder}">
<listhead>
<listheader label="Item" />
Modified: trunk/zktodo2/src/main/webapp/zktodo_c.zul
===================================================================
--- trunk/zktodo2/src/main/webapp/zktodo_c.zul 2011-09-15 04:33:13 UTC (rev 1116)
+++ trunk/zktodo2/src/main/webapp/zktodo_c.zul 2011-09-24 14:44:54 UTC (rev 1117)
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
-<?page title="ZkTodo2 - MVVM Example"?>
+<!-- ZK.forge is distributed under Lesser GPL Version see also http://www.gnu.org/licenses/lgpl.html -->
+<?page title="ZkTodo2 - MVB aka MVVM Example"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" ?>
-<?init class="org.zkforge.zktodo2.binding.CommandBinderInit" root="./buttons"?>
+<?init class="org.zkforge.zktodo2.binding.CommandBinderInit"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver" ?>
<zk xmlns="http://www.zkoss.org/2005/zul">
-<window title="To Do List" width="640px" border="normal">
-<listbox id="list" multiple="true" rows="12" model="@{toDoViewModel.reminders, load-after='add.onClick,update.onClick,delete.onClick'}" selectedItem="@{toDoViewModel.selectedReminder}">
+<window title="To Do List :: Model-View-Binder (MVB/MVVM)" width="640px" border="normal">
+<listbox id="list" multiple="true" rows="12"
+ model="@{toDoViewModel.reminders, load-after='add.onClick,update.onClick,delete.onClick'}"
+ selectedItem="@{toDoViewModel.selectedReminder}">
<listhead>
<listheader label="Item" />
<listheader label="Priority" width="80px" />
@@ -22,14 +25,17 @@
Item:<textbox cols="40" constraint="no empty"
value="@{toDoViewModel.selectedReminder.name, load-after='add.onClick,delete.onClick'}"/>
Priority:<intbox id="priority" cols="1" constraint="no empty"
- value="@{toDoViewModel.selectedReminder.priority, load-after='add.onClick,delete.onClick'}"/>
+ value="@{toDoViewModel.selectedReminder.priority, load-after='add.onClick,delete.onClick'}"
+ />
Date:<datebox id="date" cols="14" constraint="no empty"
- value="@{toDoViewModel.selectedReminder.date, load-after='add.onClick,delete.onClick'}"/>
+ value="@{toDoViewModel.selectedReminder.date, load-after='add.onClick,delete.onClick'}"
+ onChange="@{toDoViewModel, converter='org.zkforge.zktodo2.binding.InputEventCommandConverter'}"/>
</hbox>
<hbox id="buttons">
<button id="add" label="Add" width="36px" height="24px" onClick="@{toDoViewModel}"/>
<button id="update" label="Update" width="46px" height="24px" onClick="@{toDoViewModel}"/>
- <button id="delete" label="Delete" width="46px" height="24px" onClick="@{toDoViewModel}"/>
+ <button id="delete" label="Delete" width="46px" height="24px" onClick="@{toDoViewModel}"
+ />
</hbox>
</vbox>
</window>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|