extjs6 mvvm_ZK 6中的MVVM初探

extjs6 mvvm

MVVM与MVC

在上一篇文章中,我们已经看到Ajax框架ZK如何采用CSS选择器启发的Controller来在View中连接UI组件并监听它们的事件。 在此ZK MVC模式下, View中的UI组件无需绑定到任何Controller方法或数据对象。 使用选择器模式作为将View状态和事件映射到Controller的灵活性使代码更适应更改。

MVVM在相反方向上实现关注点分离。 在这种模式下,视图模型和绑定器机制代替了控制器。 绑定器将View的请求映射到View-Model中的动作逻辑,并更新双方的任何值(数据),从而允许View-Model独立于任何特定的View。

ZK 6中的MVVM的剖析

以下是ZK 6的MVVM模式的示意图:

以下是图中未传达的一些其他要点:
BindComposer:

  • 实现ZK的标准控制器接口(Composer&ComposerExt)
  • 默认实现就足够了,不需要修改

视图:

  • 通知活页夹调用哪种方法以及在视图模型上更新哪些属性

视图模型:

  • 只是一个POJO
  • 通过Java注释与活页夹进行通信

MVVM运行中

考虑在不知道确切的UI标记的情况下显示简化清单的任务。 库存是项目的集合,因此我们具有以下对象的表示形式:

public class Item {private String ID;private String name;private int quantity;private BigDecimal unitPrice;//getters & setters
}

期望可以选择并操作列表中的项目也很有意义。 因此,根据到目前为止的知识和假设,我们可以继续执行视图模型。

public class InventoryVM {ListModelList<Item> inventory;Item selectedItem;public ListModelList<Item> getInventory(){inventory = new ListModelList<Item>(InventoryDAO.getInventory());return inventory;}public Item getSelectedItem() {return selectedItem;}public void setSelectedItem(Item selectedItem) {this.selectedItem = selectedItem;}}

在这里,我们为View-Model实现提供了一个典型的POJO,以及带有其getter和setter的数据。

查看实施,“采取行动”

现在,假设我们后来了解到View的要求只是一个简单的表格显示:

实现上述UI的可能标记是:

<window title='Inventory' border='normal' apply='org.zkoss.bind.BindComposer' viewModel='@id('vm') @init('lab.zkoss.mvvm.ctrl.InventoryVM')' ><listbox model='@load(vm.inventory)' width='600px' ><auxhead><auxheader label='Inventory Summary' colspan='5' align='center'/> </auxhead><listhead><listheader width='15%' label='Item ID' sort='auto(ID)'/><listheader width='20%' label='Name' sort='auto(name)'/><listheader width='20%' label='Quantity' sort='auto(quantity)'/><listheader width='20%' label='Unit Price' sort='auto(unitPrice)'/><listheader width='25%' label='Net Value'/></listhead><template name='model' var='item'><listitem><listcell><label value='@load(item.ID)'/></listcell><listcell><label value='@load(item.name)'/></listcell><listcell><label value='@load(item.quantity)'/></listcell><listcell><label value='@load(item.unitPrice)'/></listcell><listcell><label value='@load(item.unitPrice * item.quantity)'/></listcell></listitem> </template></listbox>
</window>

让我们在这里详细说明一下标记。

  • 在第1行,我们将默认的BindComposer应用于Window组件,该组件使Window的所有子组件均受BindComposer的影响。
  • 在下一行,我们指示BindComposer实例化哪个View-Model类,并为View-Model实例提供ID,以便我们对其进行引用。
  • 由于我们正在将数据集合加载到列表框,因此在第3行,我们将View-Model实例的属性“库存”(即Item对象的集合)分配给列表框的属性“模型”。
  • 然后,在第12行,我们在模板组件上使用该模型。 模板根据收到的模型迭代其封闭的组件。 在这种情况下,我们有5个列表项,它们在列表框中组成一行。
  • 在每个Listcell中,我们加载每个对象的属性并在Labels中显示它们。

通过ZK的绑定系统,我们能够访问View-Model实例中的数据,并使用批注将其加载到View中。

查看实施,“采取两次”

假设在以后的开发中,我们同意当前的表格显示在我们的演示文稿中占用了太多空间,并且现在要求我们仅在组合框中选择该项目时才显示该项目的详细信息,如下所示:

尽管表示和行为(仅在用户选择时才显示详细信息)与我们以前的实现有所不同,但是View-Model类不需要大量修改。 由于仅当在组合框中选中某个项目的细节时才会显示它的细节,因此很明显,我们需要处理'onSelect'事件,让我们添加一个新方法doSelect

public class InventoryVM {ListModelList<Item> inventory;Item selectedItem;@NotifyChange('selectedItem')@Commandpublic void doSelect(){ }//getters & setters}

在我们的例子中,用@Command注释的方法使其有资格通过其名称从我们的标记中调用:

<combobox onSelect='@command('doSelect')' >

注释@NotifyChange('selectedItem')允许用户在组合框中选择新项目时自动更新selectedItem属性。 出于我们的目的,方法doSelect不需要其他实现。 完成这些更改后,我们现在可以看到经过稍微修改的View-Model如何与我们的新标记一起工作:

<window title='Inventory' border='normal' apply='org.zkoss.bind.BindComposer' viewModel='@id('vm') @init('lab.zkoss.mvvm.ctrl.InventoryVM')' width='600px'>...<combobox model='@load(vm.inventory)' selectedItem='@bind(vm.selectedItem)' onSelect='@command('doSelect')' ><template name='model' var='item'><comboitem label='@load(item.ID)'/></template><comboitem label='Test'/></combobox><listbox  visible='@load(not empty vm.selectedItem)' width='240px'><listhead><listheader ></listheader><listheader ></listheader></listhead><listitem><listcell><label value='Item Name: ' /></listcell><listcell><label value='@load(vm.selectedItem.name)' /></listcell></listitem><listitem><listcell><label value='Unit Price: ' /></listcell><listcell><label value='@load(vm.selectedItem.unitPrice)' /></listcell></listitem><listitem><listcell><label value='Units in Stock: ' /></listcell><listcell><label value='@load(vm.selectedItem.quantity)' /></listcell></listitem><listitem><listcell><label value='Net Value: ' /></listcell><listcell><label value='@load(vm.selectedItem.unitPrice * vm.selectedItem.quantity)' /></listcell></listitem></listbox>...
</window>
  • 在第4行,我们将数据收集清单加载到Combobox的model属性,以便它可以使用在第7行声明的Template组件来迭代显示数据模型中每个Item对象的ID。
  • 在第5行,selectedItem属性指向该Item对象列表上最近选择的Item。
  • 在第6行,我们已将onSelect事件映射到View-Model的doSelect方法
  • 在第12行,仅当View-Model中的selectedItem属性不为空时,才使包含项明细的列表框可见(在组合框中选择一个项之前,selectedItem将保持为空)。
  • 然后加载selectedItem的属性以填充列表框。

回顾

在MVVM模式下,我们的View-Model类将其数据和方法公开给活页夹; 没有参考任何特定的View组件。 View实现通过绑定器访问数据或调用事件处理程序。

在本文中,我们仅介绍ZK的MVVM机制的基本原理。 活页夹显然不仅限于从视图模型中加载数据。 除了将数据从View保存到ViewModel之外,我们还可以混合使用View to View-Model通信注入数据转换器和验证器。 MVVM模式也可以与MVC模型结合使用。 也就是说,如果我们愿意的话,我们还可以通过MVC Selector机制连接组件并监听激发的事件。

我们稍后将深入探讨其中一些主题。

参考:我们的JCG合作伙伴 Lance Lu在Tech Dojo博客上对ZK 6中的MVVM进行了初步了解 。


翻译自: https://www.javacodegeeks.com/2012/06/first-look-at-mvvm-in-zk-6.html

extjs6 mvvm

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

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

相关文章

多线程 调用 axis 报错_java笔记录(三、多线程)

1、进程和线程&#xff1a;进程&#xff1a;正在进行的程序。每一个进程执行都有一个执行顺序&#xff0c;该顺序是一个执行路径&#xff0c;或者叫一个控制单元。线程&#xff1a;进程内部的一条执行路径或者一个控制单元。两者的区别&#xff1a;一个进程至少有一个线程进程在…

使用PropertyPlaceholderConfigurer读取属性文件

1.简介 通常&#xff0c;当我们考虑将多个应用程序部署到生产环境之前在其中部署服务器时&#xff0c;可以在外部属性文件中配置特定于环境的参数 。 它可能是数据库详细信息&#xff0c;对于测试服务器和生产服务器而言&#xff0c;这是不同的。 因此最好选择将数据库配置文件…

第二天:Swift手势操控弹性按钮

参考链接:https://www.jianshu.com/p/f080ede0f3a8 1 import UIKit2 3 fileprivate let buttonH: CGFloat 2004 5 class ViewController: UIViewController, UIGestureRecognizerDelegate {6 7 IBOutlet weak var segmentControl: UISegmentedControl!8 var randomBtn…

asp获取mysql数据报错_ASP.NET在删除掉数据库文件后报错处理

在开发asp.net mvc程序时&#xff0c;默认时我们会使用LocalDB, 我们有时会以为删除掉App_Data目录就可以自动新建数据库&#xff0c;但是我们在网站重新启动后(进入Account)就会发现报如下错误&#xff1a;The ASP.NET Simple Membership database could not be initialized. …

按插入顺序排序的map

LinkedHashMap HashMap是无序的&#xff0c;HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中&#xff0c;然后遍历出HashMap的顺序跟put的顺序不同。单纯的HashMap是无法实现排序的。 区别&#xff1a; 1.HashMap里面存入…

lua excel to mysql_在Lua程序中使用MySQL的教程

http://www.jb51.net/article/66972.htmhttps://www.2cto.com/database/201501/372767.html常用sql语句&#xff1a;mysql -h localhost -u 用戶名 -p密碼 //連接數據庫use desk_show; //使用數據庫show tables; …

java实践_Java怪异实践

java实践总览 Java中有许多实践使我感到困惑。 这里只是一些。 使用-Xmx和-Xms 选项-Xmx广泛用于设置最大内存大小。 如Java HotSpot VM Options中所述&#xff0c;以-X开头的选项是非标准的&#xff08;不保证所有VM实施都支持该选项&#xff09;&#xff0c;并且在以后的JDK…

函数参数:

函数参数&#xff1a;一、位置参数:按顺序一一对应赋值 def stu(name,age,course,country) stu("刘老根",25,"linux","CN")二、关健参数&#xff1a;在实参中使用 号赋值&#xff08;可以不按顺序&#xff09; def stu(name,a…

mysql group by 重复_mysql – 使用GROUP BY删除重复项的查询

id_specific_price id_product-------------------------------1 22 23 24 35 36 37 3需要删除重复项,预期结果&#xff1a;id_specific_price id_product-------------------------------3 27 3SELECT *FROM ps_specific_priceWHERE id_specific_price NOT IN(SELECT MAX(id_s…

您的JAX-RS API并非天生就等于:使用动态功能

这次&#xff0c;我们将讨论一些有关JAX-RS 2.0 API的内容&#xff0c;并涉及该规范的一个非常有趣的方面&#xff1a; 动态功能以及它们的有用性。 传统上&#xff0c;当配置和部署JAX-RS 2.0 API&#xff08;使用Application类&#xff0c;从servlet引导或通过RuntimeDelega…

ionic2 安装与cordova打包

1.安装&#xff1a; cnpm install -g cordova ionic ionic start name cd name cnpm install 2、环境配置&#xff1a; http://www.cnblogs.com/changyaoself/p/6544082.html 这里是具体配置。 测试环境&#xff1a; cordova platform list 如下才可以&#xff1a; 3、添加…

mysql vacuum_PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布&#xff0c;从那时开始&#xff0c;他得到了很多扩展。根据db-enginers上的排名情况&#xff0c;PostgreSQL目前在数据库领域排名第四。 本篇博客&#xff0c;我们来讨论一下PostgreSQL的内部架…

(ab)使用Java 8 FunctionalInterfaces作为本地方法

如果您使用Scala或Ceylon甚至JavaScript等更高级的语言进行编程&#xff0c;则“嵌套函数”或“本地函数”是您非常常见的习惯用法。 例如&#xff0c;您将编写诸如fibonacci函数之类的东西&#xff1a; def f() {def g() "a string!"g() "– says g" …

mysql的配置实现远程访问_MySQL 远程连接配置的正确实现 | 学步园

此文章主要向大家描述的是MySQL远程连接配置的实际操作步骤&#xff0c;以及在其实际操作中值得我们大家注意的相关事项的描述&#xff0c; 以下就是具体方案的描述&#xff0c;希望在你今后的学习中会有所帮助。MySQL远程配置GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED…

oracle 用户账户被锁处理

一、以管理员身份登录 SQL> conn sys/sys as sysdba; &#xff08;分号是必须的但是我是以system登录的所在这不应该写conn sys/sys as sysdba应该写conn system/orcl as sysdba;&#xff09;Connected. 二、解锁被锁用户SQL> alter user scott account unlock;User alte…

总结mysql的基础语法_mysql 基础sql语法总结 (二)DML

二、DML(增、删、改)1)插入数据第一种写法&#xff1a;INSERT INTO 表名 (列名1&#xff0c;列名2&#xff0c;&#xff0c;......)VALUES(列值1&#xff0c;列值2&#xff0c;......)第二种写法&#xff1a;INSERT INTO 表名 VALUES(列值1&#xff0c;列值2&#xff0c;......…

提高团队协作效率

提高团队协作效率 分工合理&#xff0c;责任明确 团队是由个人组成的&#xff0c;团队中的个人往往经历不同、背景不同、性格有差异、水平有高低。在团队形成后、正式开工前&#xff0c;首先应该进行合理分工&#xff0c;要结合每个 人的特点和爱好&#xff0c;充分发挥出每个人…

mysql远程访问时间长无反应_远程MySQL访问需要很长时间

Running a MySQL query on a local database takes only about 20-30ms but running the same query through a remote connection(internet) takes 500ms. Is this normal? If not what could be the possible reason for such delay?This is a wireshark time extract for …

c# 利用AForge和百度AI开发实时人脸识别

baiduAIFaceIdentify项目是C#语言&#xff0c;集成百度AI的SDK利用AForge开发的实时人脸识别的小demo&#xff0c;里边包含了人脸检测识别&#xff0c;人脸注册&#xff0c;人脸登录等功能 人脸实时检测识别功能 思路是利用AForge打开摄像头&#xff0c;通过摄像头获取到的图像…

Java中Array和ArrayList之间的9个区别

array和ArrayList都是Java中两个重要的数据结构&#xff0c;在Java程序中经常使用。 即使ArrayList在内部由数组支持&#xff0c;了解Java中的数组和ArrayList之间的差异对于成为一名优秀的Java开发人员也至关重要。 如果您知道相似点和不同点&#xff0c;则可以明智地决定何时…