这是我们从头开始构建ZK应用程序的第二集。 上一篇文章涉及使用MVVM将数据加载和呈现到表中。 在本文中,我们将向您介绍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 –表单绑定相关推荐

  1. mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定

    mvvm 自动绑定 这是我们从头开始构建ZK应用程序的第二集. 上一篇文章介绍了使用MVVM将数据加载和呈现到表中. 在本文中,我们将向您介绍ZK MVVM的表单绑定. 目的 我们将构建一个" ...

  2. Vue的常用指令(v-html {{}}文本插值,v-bind绑定属性,v-if条件渲染,v-for列表渲染,v-on @ 事件绑定,v-model表单绑定)

    Vue的常用指令(文本插值,绑定属性,条件渲染,列表渲染,事件绑定,表单绑定) Vue 的介绍 Vue 是一套构建用户界面的渐进式前端框架. 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已 ...

  3. Spirng MVC +Velocity 表单绑定命令对象

    通常,表单中的数据在提交之后可以通过Spring MVC的@RequestParam注解在控制器函数的参数列表中中提取出来,但是一旦表单数据过多的话,参数列表将会变得非常长,最好的解决方案是将表单中的 ...

  4. 表单绑定 v-model —— :value @input || v-model原理

    表单绑定 v-model  01-v-model的基本使用 <!DOCTYPE html> <html lang="en"> <head>< ...

  5. Vue之for列表渲染、methods事件和model表单绑定

    2.4 for列表渲染 文档:https://cn.vuejs.org/v2/guide/list.html v-for指令可以绑定数组的数据来渲染一个项目列表 v-for指令需要使用item in ...

  6. Vue.js 2.x笔记:表单绑定(3)

    1. 基础用法 v-model 指令:在表单 input 和 textarea 元素上创建双向数据绑定. 1.1 单行文本(Text) <div id="app">&l ...

  7. SharePoint 使用脚本为表单绑定事件

    在SharePoint的使用过程中,我们经常需要为表单页面做一些特殊处理,比如说新建页面的时候有多选项的字段,但是只能选择指定数量的选项,尤其在新闻列表或者调查列表等特殊场景中,广泛使用. 下面,我们 ...

  8. 表单绑定复选框的值和图片上传

    表单如何实现与复选框的值绑定一致 <u-form-item :label-position="labelPosition" label="提供服务" pr ...

  9. KnockoutJS 3.X API 第四章 表单绑定(11) options绑定

    目的 options绑定主要用于下拉列表中(即<select>元素)或多选列表(例如,<select size='6'>).此绑定不能与除<select>元素之外的 ...

最新文章

  1. JS中的prototype
  2. 关于微软Silverlight,你应该知道的10件事
  3. python实现图形旋转_python轻松实现图片旋转
  4. 【机器学习】模型压缩大杀器!详解高效模型设计的自动机器学习流水线
  5. 小学经历——我家有猪
  6. 主成分分析(PCA)算法,K-L变换 角度
  7. (二叉树的动态创建与bfs)树的层次遍历
  8. 湖南单招计算机专业大学排名,2021湖南单招学校排名及分数线:湖南单招分数线高吗?...
  9. [转载] 七龙珠第一部——第114话 悟空的愿望 卡林大人好为难
  10. 市场调研思维导图模板
  11. 二维分类教案_大班数学活动二维分类
  12. FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程
  13. 给一个年份输出该年是否举办足球世界杯的信息,以及给一个国家的名称输出是否夺得过世界杯冠军
  14. 四大开源3d游戏引擎探究(前言上)
  15. MOOC中国大学慕课C语言期末编程试题
  16. 学习编程从哪里开始比较好呢?有什么推荐?
  17. android mac 照片恢复,万兴安卓照片恢复软件(Mac版本)指南
  18. 在Pycharm中输入中文显示为繁体的解决办法
  19. html文件内容重叠,html – CSS:页脚重叠内容,其他故障
  20. i++是线程安全的吗

热门文章

  1. 在diy的文件系统上创建文件的流程
  2. mybatis多表新增如何获取主键ID
  3. java oauth2.0_OAuth 2.0 Java指南:5分钟保护您的应用程序安全
  4. activiti脚本任务_Activiti中的安全脚本如何工作
  5. 项目经理升职了是啥_什么是升职率?
  6. jooq和jdbc_将jOOQ与JDBC比较
  7. jaxb报错_JAXB做错了; 尝试Xembly
  8. Java中的RAII
  9. 面向对象的代码生成方法
  10. C代码的运行速度总是比Java快,对吧? 错误!