zoukankan      html  css  js  c++  java
  • ZK Framework(四、MVVM模式)

    官网例子:http://books.zkoss.org/wiki/ZK_Getting_Started/Get_ZK_Up_and_Running_with_MVVM

    (一)业务流程(与MVC例子一样)

    1、查询小车列表

    2、显示某一小车详细信息

    (二) 工程

    下载地址:http://www.cnblogs.com/jrsmith/admin/Files.aspx

    MVVM.rar

    searchMvvm.zul:

    1、window: apply值从原来的某个SearchController,到现在的viewModel, org.zkoss.bind.BindComposer说明viewMoel是Binder,即将zul里的component绑定到SearchViewModel类。id('vm')唯一标识viewMoel

    2、@bind(vm.xxxx): 即将某一个Component绑定到ViewModel具体的全局变量去,通过getter/setter方法交互。

      注:个人认为这里的跟ZK MVC的原理一样,只不过是将MVC里SearchController的变量映射放到View层而已。不过这样的好处是你想映射哪个组件就映射哪个,不想映射就不加@bind。

    3、@command('xxx'): 指定ViewModel里响应的方法,这里的是search()方法。

     1 <window title="Search" width="600px" border="normal"
     2     apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('com.core.vm.SearchViewModel')">
     3     <hbox align="center">
     4         Keyword:
     5         <textbox value="@bind(vm.keyword)" />
     6         <button label="Search" image="/img/search.png" onClick="@command('search')" />
     7     </hbox>
     8     <listbox height="160px" model="@bind(vm.carList)" emptyMessage="No car found in the result"
     9     selectedItem="@bind(vm.selectedCar)">
    10         <listhead>
    11             <listheader label="Model" />
    12             <listheader label="Make" />
    13             <listheader label="Price" width="20%"/>
    14         </listhead>
    15         <template name="model">
    16             <listitem>
    17                 <listcell label="@bind(each.model)"></listcell>
    18                 <listcell label="@bind(each.make)"></listcell>
    19                 <listcell>$<label value="@bind(each.price)" /></listcell>
    20             </listitem>
    21         </template>
    22     </listbox>
    23     <hbox style="margin-top:20px">
    24         <image width="250px" src="@bind(vm.selectedCar.preview)" />
    25         <vbox>
    26             <label value="@bind(vm.selectedCar.model)" />
    27             <label value="@bind(vm.selectedCar.make)" />
    28             <label value="@bind(vm.selectedCar.price)" />
    29             <label value="@bind(vm.selectedCar.description)" />
    30         </vbox>
    31     </hbox>
    32 </window>

    SearchViewModel.java:

    1、这里纯属POJO,定义全局变量,getter/seter方法。变量名称要与view层理的@bind(vm.xxx)名称一致。

    2、@command('xxx') : 对应view层里的响应事件,不指定名称的话默认为修饰的方法名称。

    3、@NotifyChange("carList") : 指当carList内容改变后告诉ZK马上更新view层里对应的carList Model.

     1 package com.core.vm;
     2 
     3 import java.util.List;
     4 import org.zkoss.bind.annotation.*;
     5 
     6 import com.core.model.Car;
     7 import com.core.service.CarService;
     8 import com.core.serviceImpl.CarServiceImpl;
     9 
    10 public class SearchViewModel {
    11         
    12         private String keyword;
    13         private List<Car> carList;
    14         private Car selectedCar;
    15         
    16         private CarService carService = new CarServiceImpl();
    17         
    18         public void setKeyword(String keyword) {
    19                 this.keyword = keyword;
    20         }
    21         public String getKeyword() {
    22                 return keyword;
    23         }
    24 
    25         public List<Car> getCarList(){
    26                 return carList;
    27         }
    28         
    29                 
    30         public void setSelectedCar(Car selectedCar) {
    31                 this.selectedCar = selectedCar;
    32         }
    33         public Car getSelectedCar() {
    34                 return selectedCar;
    35         }
    36 
    37         
    38         @Command
    39         @NotifyChange("carList")
    40         public void search(){
    41                 carList = carService.search(keyword);
    42         }
    43 }

    (三)MVVM

    左边为MVC,右边为MVVM。

    两者最大的区别在于MVVM的通过binder来实现数据的同步,而MVC则需要通过Controller来手动修改数据。

    The biggest difference from the Controller in the MVC is that ViewModel should not contain any reference to UI components and knows nothing about the View's visual elements.(官网)

    (四)运行

  • 相关阅读:
    java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
    项目开发中关于权限的实现方案简单描述(帮助以后回忆)
    一些比较有用的模板
    递归之遍历部门
    关于s2sh框架关于hibernate懒加载问题的说明和解决方案
    Hibernate实体映射配置(XML)简单三步完美配置
    项目添加性能监控日志
    redis常用命令大全
    redis主从同步
    redis之哨兵部署运行日志解读
  • 原文地址:https://www.cnblogs.com/damonhuang/p/3114387.html
Copyright © 2011-2022 走看看