ZK的实际应用:MVVM –表单绑定

这是我们从头开始构建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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群晖按装mysql_如何连接群晖里的MYSQL数据库

匿名用户1级2018-08-27 回答一、连接远程数据库&#xff1a;1、显示密码如&#xff1a;MySQL 连接远程数据库(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用户名为“root”&#xff0c;密码“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隐藏密…

ZK的实际应用:MVVM –以编程方式更新视图

在前两篇文章中&#xff0c;我们使用ZK的MVVM功能来&#xff1a; 将数据加载到表中 使用表单绑定保存数据 我们已经看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;装饰方法时&#xff0c;在执行完成后&#xff0c;将向Binder通知VM属性的更改&#xff0c;以便B…

给你一个笑脸

今日冬至&#xff0c;愿你笑靥如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安装与配置的截图_windows下MySQL5.6版本安装及配置过程附有截图和详细说明...

随着MYSQL版本的更新以及电脑系统的变化&#xff0c;我们给大家整理了各种电脑环境下安装MYSQL的图解过程&#xff0c;希望我们整理的内容能够帮助到大家&#xff1a;mysql安装图解总结https://www.jb51.net/article/142398.htm编辑者&#xff1a;Vocabulary下面详细介绍5.6版本…

mysql 更新日的数据类型_[每日更新-MySQL基础]5.常用的数据类型-整数和字符串

1. 数据类型在学习PHP的时候我们已经讲过数据类型了&#xff0c;所谓数据类型就是数据的格式。每一种数据类型在计算机中存储的方式会有差异&#xff0c;占用的存储容量也有区别&#xff0c;所以选择合适的数据类型可以节约我们的存储成本&#xff0c;也方便我们的程序运行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我对Martin Fowler的这篇文章对Spring进行了介绍。从那时起&#xff0c;我就修改了许多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。虽然我很喜欢与IoC一起工作&#xff0c;但我必须说Spring在过去的5年中&am…

ansible 安装

1、简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的&#…

JS原型详解

参考的别人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型对象&#xff0c;简称原型。不仅构造函数有&#xff0c;普通函数也有* 普通函数&#xff1a;javascript function puTong(){ }; alert(puTong.proto…

c# mysql 插入 和 查询_C#对数据库的操作(增删改查)

1、【在web.config文件中配置】2、【连接字符串】private static readonly string StrCon ConfigurationManager.ConnectionStrings["sqlConnection"].ToString();3、【查询数据方法】/// /// 查询数据/// /// 查询语句/// 参数/// public static DataTable QueryDa…

利用docker在window7下安装TensorFlow

安装过程下碰了不少坑&#xff0c;记录一下安装过程&#xff0c;方便以后有需要时复用。 1、安装docker 下载最新版本的docker并且默认安装即可&#xff0c;安装后打开Docker Quickstart Terminal&#xff0c;初次进去需要一段时间。 下载网址&#xff1a;https://www.docker.c…

哈希长度扩展攻击

在这篇文章中&#xff0c;我将尽力避免夏季的低迷&#xff0c;而将重点放在比抱怨天气更有趣的事情上-哈希长度扩展攻击。 散列长度扩展攻击没什么复杂或复杂的&#xff0c;说实话&#xff0c;这只是关于如何使用散列函数。 正如我以前的一篇文章中所讨论的那样&#xff0c;哈希…

2017年07月03号课堂笔记

2017年07月03号 星期一 多云 空气质量&#xff1a;轻度污染~中度污染 内容&#xff1a;MySQL第四节课 in和not in&#xff1b;两个表的内连接&#xff1b;exists和not exsits的使用&#xff1b;all,any和some&#xff1b; 使用子查询的注意事项&#xff1b;sql优化&#xff08…

excel文件被写保护怎么解除_u盘被写保护怎么解除,看完你就知道了

在平常我们使用U盘存储资料过程中&#xff0c;有时会发现U盘出现无法正常读写的现象&#xff0c;具备表现为U盘被写保护&#xff0c;无法正常执行读写操作。对于小编给大家提供以下解决方法&#xff0c;希望对大家能有所帮助。对U盘执行重置操作01上网搜索并下载“USBOOT”程序…

新建MAVEN项目--pom.xml报错

使用集成了maven的Eclipse版本新建maven项目后&#xff0c;配置文件pom.xml会在project以及引用的xsd文件处出现错误&#xff08;第一、二行报错&#xff09; 其中一个报错例子&#xff1a; Multiple annotations found at this line:- Plugin execution not covered by lifecy…

OSGi案例研究:模块化vert.x

OSGi使Java代码可以清晰地划分为多个模块&#xff0c;这些模块称为捆绑软件 &#xff0c;可以访问由每个捆绑软件的类加载器控制的代码和资源。 OSGi 服务提供了一种附加的分离机制&#xff1a;接口的用户不需要依赖于实现类&#xff0c;工厂等。 以下案例研究旨在使OSGi捆绑包…

mysql一些常用操作_表的一些常用操作_MySQL

bitsCN.com-创建表(也就是创建表结构)&#xff1a;create table tbl_name(列结构&#xff0c;即有哪些属性)[表选项]; 如&#xff1a;班级的信息&#xff1a;(班级编号&#xff0c;开班日期)create table java_class(class_num varchar(10),date_start date);注&#xff1a;该表…

网站appache的ab命令压力测试性能

①&#xff1a;相关不错的博文链接&#xff1a;http://johnnyhg.iteye.com/blog/523818 ②&#xff1a;首先配置好对应的环境上去&#xff0c;有对应的命令 ③&#xff1a;压力测试的指令如下&#xff1a; 1. 最基本的关心两个选项 -c -n例&#xff1a; ./ab -c 100 -n 10000 &…

如何调整自定义标签样式

用chromeF12&#xff0c;查看网页代码在自定义标签上加class&#xff0c;写样式&#xff1a;例如&#xff1a;JSP文件&#xff1a;来自为知笔记(Wiz)转载于:https://www.cnblogs.com/anobugworld/p/7112116.html

无需部署即可测试JPQL / HQL

您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL&#xff1f; 我们今天在这里看到的是适用于任何JPA实现的简单解决方案&#xff1a;Hibernate&#xff0c;OpenJPA&#xff0c;EclipseLink等。 这篇文章中找到的基本源代码来自于本书&#xff1a;“ Pro JPA 2&#xf…

freemarker页面中文乱码

一、前言 简单的记录freemarker遇到的错误问题&#xff1a;ftl页面中文乱码 由于freemarker整合在ssm框架中&#xff0c;所以笔者直接贴配置代码 <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…