ZK的实际应用:MVVM –表单绑定
目的
我们将构建一个“添加”功能,使我们能够将新条目保存到清单中。
单击“添加”时出现表格 |
单击“保存”后,将添加新条目 |
ZK实战功能
- MVVM:保存,表单绑定,条件绑定
使用MVVM表单绑定添加新条目
我们需要实现以下部分:
- 增强我们的ViewModel POJO
- 添加UI标记以呈现表单并用适当的注释装饰标记
ViewModel类
public class InventoryVM {private List<item> items;private Item newItem;@NotifyChange("newItem")@Commandpublic void createNewItem(){newItem = new Item("", "",0, 0,new Date());}@NotifyChange({"newItem","items"})@Commandpublic void saveItem() throws Exception{DataService.getInstance().saveItem(newItem);newItem = null;items = getItems();}@NotifyChange("newItem")@Commandpublic void cancelSave() throws Exception{newItem = null;}public List<item> getItems() throws Exception{items = DataService.getInstance().getAllItems();return items;}}
- 第4行,我们声明了一个名为newItem的Item对象,该对象将引用要保存到数据库的Item实例。
- 第6行, @ NotifyChange通知绑定程序在关联的ViewModel属性状态上更新UI。
在下面显示的UI标记的第8行,我们有一个Groupbox并带有visible =” @ load( 不是空vm.newItem ) 批注 ,因此一旦createNewItem将Item实例分配给newItem时 ,Groupbox将变为可见。
简而言之, @ NotifyChange会根据ViewModel属性的更新来刷新UI。 - 在第7行,我们用@Command注释了createNewItem方法,在下面显示的UI标记中,在第4行,我们有一个带有onClick =” @ commnad(createNewItem)”的工具栏按钮 。 因此,当单击工具栏按钮时,将调用createNewItem方法。
- 类似地,从第12行到第18行,我们有一个saveItem方法,当其对应的onClick事件被触发时将调用该方法。 将新的Item对象保存到数据库缓存后,我们将newItem重置为null并检索新的项目列表。 与之前一样,使用@NotifyChange对ViewModel属性newItem (现在再次为null)和项目 (现在具有额外的条目)所做的更改将反映到UI。
标记
<window apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('lab.sphota.zk.ctrl.InventoryVM')">
<toolbar><toolbarbutton label="Add" onClick="@command('createNewItem')" />
</toolbar>
<groupbox form="@id('itm') @load(vm.newItem) @save(vm.newItem, before='saveItem')"visible="@load(not empty vm.newItem)"><caption label="New Item"></caption><grid width="50%"><rows><row><label value="Item Name" width="100px"></label><textbox id="name" value="@bind(itm.name)" /></row><row><label value="Model" width="100px"></label><textbox value="@bind(itm.model)" /></row><row><label value="Unit Price" width="100px"></label><decimalbox value="@bind(itm.price)" format="#,###.00"constraint="no empty, no negative" /></row><row><label value="Quantity" width="100px"></label><spinner value="@bind(itm.qty)"constraint="no empty,min 0 max 999: Quantity Must be Greater Than Zero" /></row><row><cell colspan="2" align="center"><button width="80px" label="Save"onClick="@command('saveItem')" mold="trendy" /><button width="80px" label="Cancel"onClick="@command('cancelSave')" mold="trendy" /></cell></row></rows></grid>
</groupbox>
<listbox>
...
</listbox>
</window>
- 第1行,我们应用ZK的BindComposer的默认实现。 它负责实例化我们的ViewModel和Binder实例。
- 第2行,我们提供了要实例化的ViewModel的完整类名,并为其提供了ID以供将来参考
- 在第4行中,我们将ViewModel的“命令方法” createNewItem分配为工具栏按钮的onClick事件处理程序。
- 第6行,使用ID“ itm”使整个Groupbox中均可引用ViewModel中的newItem属性。
- 第6,7行使用表单绑定,以避免将无效或不完整的数据保存到ViewModel属性,将表单中的条目保存到一个临时对象,直到调用命令方法saveItem 。
- 在第8行,我们显示了Groupbox,只有用户单击“ Add”按钮时,它才能输入新的Item条目; 依次调用createNewItem方法并为VM属性newItem分配具有默认值(空字符串和0s)的Item实例。
- 在第14、18、22、27行中,我们将Item属性与输入元素绑定在一起。 @bind实际上等效于@load加@save。
简而言之
总结点形式:
- 使用表单绑定可避免通过将表单条目保存到临时对象来直接修改ViewModel属性中的数据。 仅在满足指定条件的情况下,才将数据写入ViewModel属性。 在我们的示例中,仅当调用saveItem方法时。
- @Command批注允许绑定程序将UI事件处理程序映射到ViewModel命令方法。
- @NotifyChange通知联编程序,在执行命令方法后,哪些ViewModel属性已被修改,以便可以将数据更改反映在UI上。
- 我们可以在运行时通过MVVM绑定将值分配给任何UI组件的属性,以操纵诸如可见性,样式,禁用/启用等参数。
在这篇文章中,我们还没有看到如何验证数据条目。 在此之前,我们将在下一篇文章中实现删除和编辑功能。
参考 ZK开发人员参考
参考: ZK in Action [1]:MVVM –来自我们JCG合作伙伴 Lance Lu的Form Binding ,位于Tech Dojo博客上。
翻译自: https://www.javacodegeeks.com/2012/07/zk-in-action-mvvm-form-binding.html
ZK的实际应用:MVVM –表单绑定相关推荐
- mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定
mvvm 自动绑定 这是我们从头开始构建ZK应用程序的第二集. 上一篇文章介绍了使用MVVM将数据加载和呈现到表中. 在本文中,我们将向您介绍ZK MVVM的表单绑定. 目的 我们将构建一个" ...
- Vue的常用指令(v-html {{}}文本插值,v-bind绑定属性,v-if条件渲染,v-for列表渲染,v-on @ 事件绑定,v-model表单绑定)
Vue的常用指令(文本插值,绑定属性,条件渲染,列表渲染,事件绑定,表单绑定) Vue 的介绍 Vue 是一套构建用户界面的渐进式前端框架. 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已 ...
- Spirng MVC +Velocity 表单绑定命令对象
通常,表单中的数据在提交之后可以通过Spring MVC的@RequestParam注解在控制器函数的参数列表中中提取出来,但是一旦表单数据过多的话,参数列表将会变得非常长,最好的解决方案是将表单中的 ...
- 表单绑定 v-model —— :value @input || v-model原理
表单绑定 v-model 01-v-model的基本使用 <!DOCTYPE html> <html lang="en"> <head>< ...
- Vue之for列表渲染、methods事件和model表单绑定
2.4 for列表渲染 文档:https://cn.vuejs.org/v2/guide/list.html v-for指令可以绑定数组的数据来渲染一个项目列表 v-for指令需要使用item in ...
- Vue.js 2.x笔记:表单绑定(3)
1. 基础用法 v-model 指令:在表单 input 和 textarea 元素上创建双向数据绑定. 1.1 单行文本(Text) <div id="app">&l ...
- SharePoint 使用脚本为表单绑定事件
在SharePoint的使用过程中,我们经常需要为表单页面做一些特殊处理,比如说新建页面的时候有多选项的字段,但是只能选择指定数量的选项,尤其在新闻列表或者调查列表等特殊场景中,广泛使用. 下面,我们 ...
- 表单绑定复选框的值和图片上传
表单如何实现与复选框的值绑定一致 <u-form-item :label-position="labelPosition" label="提供服务" pr ...
- KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
目的 options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>).此绑定不能与除<select>元素之外的 ...
最新文章
- JS中的prototype
- 关于微软Silverlight,你应该知道的10件事
- python实现图形旋转_python轻松实现图片旋转
- 【机器学习】模型压缩大杀器!详解高效模型设计的自动机器学习流水线
- 小学经历——我家有猪
- 主成分分析(PCA)算法,K-L变换 角度
- (二叉树的动态创建与bfs)树的层次遍历
- 湖南单招计算机专业大学排名,2021湖南单招学校排名及分数线:湖南单招分数线高吗?...
- [转载] 七龙珠第一部——第114话 悟空的愿望 卡林大人好为难
- 市场调研思维导图模板
- 二维分类教案_大班数学活动二维分类
- FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
- 给一个年份输出该年是否举办足球世界杯的信息,以及给一个国家的名称输出是否夺得过世界杯冠军
- 四大开源3d游戏引擎探究(前言上)
- MOOC中国大学慕课C语言期末编程试题
- 学习编程从哪里开始比较好呢?有什么推荐?
- android mac 照片恢复,万兴安卓照片恢复软件(Mac版本)指南
- 在Pycharm中输入中文显示为繁体的解决办法
- html文件内容重叠,html – CSS:页脚重叠内容,其他故障
- i++是线程安全的吗