本篇说的是View层,即视图层,在本示例中包括两个部分:MXML文件,即可视控件;Mediator。

可视控件

可视控件由UserForm.mxml(图1)和UserList.mxml(图2)两个文件组成。UserForm.mxml用于添加用户,UserList.mxml显示用户和删除已添加用户。

【图1】

【图2】

先看UserForm.mxml,既然要添加用户,就一定会要一个方法。你还记得么,在上一篇《pureMVC简单示例及其原理讲解——Model层 》中我们提到的UserProxy中有一个ArrayCollection类型的users属性和无返回值的addItem方法,其中users中存储UserVO,addItem方法用来向users中添加UserVO。现在我们既然要在界面通过添加按钮添加用户,我们必然要用到这个方法,但是我们不会在View层直接使用这个方法。因为pureMVC的追求是将MVC分离,而这些逻辑操作我们都会将其放入Command中,即Controller才层。但是在View层,我们也不是没有作为的。我先调一调你的胃口,不要着急,这个作为我们会在本篇接下来的部分讲。先看看userForm.mxml的代码。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Panel title="Registor" xmlns:mx="http://www.adobe.com/2006/mxml">
  3. <mx:Metadata>
  4. [Event('add')]
  5. </mx:Metadata>
  6. <mx:Script>
  7. <![CDATA[
  8. import mx.controls.Alert;
  9. import com.superwulei.model.vo.UserVO;
  10. public static const USER_ADD:String = "add";
  11. public var user:UserVO;
  12. /* 添加用户 */
  13. private function addUser():void {
  14. user = new UserVO(email.text, password.text);
  15. dispatchEvent(new Event(USER_ADD));
  16. }
  17. private function enableSubmit(u:String, p:String):Boolean {
  18. return u != '' && p != '';
  19. }
  20. ]]>
  21. </mx:Script>
  22. <mx:Form>
  23. <mx:FormItem label="email" required="true">
  24. <mx:TextInput id="email"/>
  25. </mx:FormItem>
  26. <mx:FormItem label="password" required="true">
  27. <mx:TextInput id="password" displayAsPassword="true"/>
  28. </mx:FormItem>
  29. </mx:Form>
  30. <mx:ControlBar horizontalAlign="right">
  31. <mx:Button id="sbumitButton" label="添加"
  32. enabled="{enableSubmit(email.text,password.text)}"
  33. click="addUser();"/>
  34. </mx:ControlBar>
  35. </mx:Panel>

在UserForm.mxml中定义一个Event,并对应的定义一个USER_ADD常量。来看看点击添加按钮后会怎么样?找到submitButton按钮的click事件对应的方法addUser。在addUser方法中,首先要生成一个UserVO对象user,这个user存储的信息就是你在界面上输入的email和密码;此外还要注意,这个UserVO的对象user事先已经声明,且是public的访问修饰符。之所以将user的访问限制设定为公有的,是由于这个user会在其他地方用到,这个其他地方请您关注。

一般的,一个可视控件会对应一个Mediator;但有时候多个可视控件也会对应一个Mediator。本示例中,可视控件和Mediator的关系是前者,即一对一。来看看UserForm.mxml对应的UserFormMediator.as代码。

  1. package com.superwulei.view
  2. {
  3. import com.superwulei.ApplicationFacade;
  4. import com.superwulei.view.components.UserForm;
  5. import flash.events.Event;
  6. import org.puremvc.as3.patterns.mediator.Mediator;
  7. public class UserFormMediator extends Mediator
  8. {
  9. public static const NAME:String = "UserFormMediator";
  10. public function UserFormMediator(viewComponent:Object)
  11. {
  12. super(NAME, viewComponent);
  13. userForm.addEventListener(UserForm.USER_ADD,onAdd);
  14. }
  15. private function get userForm():UserForm{
  16. return viewComponent as UserForm;
  17. }
  18. /* 添加用户监听器 */
  19. private function onAdd(event:Event):void{
  20. add();
  21. }
  22. /* 添加用户方法 */
  23. private function add():void{
  24. sendNotification(ApplicationFacade.USER_ADDED,userForm.user);
  25. }
  26. }
  27. }

在View层,Mediator是pureMVC的核心,其私有变量viewComponent表示一个可视控件,上例中viewComponent表示UserForm,通过userForm属性实现。

看构造器UserFromMediator(...)。首先调用了父类的构造方法;然后给userForm属性加上onAdd监听器,这个userFrom属性是通过getter方法实现的,见get userForm():UserForm。来看onAdd监听器,调用add方法,在add方法中使用了sendNotification方法。刚才我们所说的添加用户的方法不是没有作为,这就是我所谓的有所作为,即“发送通知”。pureMVC中将逻辑控制放在了Controller层,因此在View层就不会有添加用户的代码,但是我们将“添加用户”这个命令以通知的方式发送出去。注意sendNotification方法中携带了两个参数,第一个参数是一个常量,第二个参数是一个UserVO对象。这个常量表示会调用与之对应的Command,这个UserVO对象表示的就是要添加的用户。这个在Controller层会讲到。

UserList.mxml和UserListMediator.as和上面的道理是类似的,在此不多言。以下是UserList.mxml和UserListMediator.as的代码。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="已注册用户">
  3. <mx:Metadata>
  4. [Event('delete')]
  5. </mx:Metadata>
  6. <mx:DataGrid id="userGrid" dataProvider="{users}">
  7. <mx:Script>
  8. <![CDATA[
  9. import mx.formatters.DateFormatter;
  10. import com.superwulei.model.vo.UserVO;
  11. import mx.collections.ArrayCollection;
  12. public static const USER_DELETE:String = "delete";
  13. [Bindable]
  14. public var users:ArrayCollection;
  15. public var selectUser:UserVO;
  16. private function deleteUser():void{
  17. selectUser = userGrid.selectedItem as UserVO;
  18. dispatchEvent(new Event(USER_DELETE));
  19. }
  20. ]]>
  21. </mx:Script>
  22. <mx:columns>
  23. <mx:DataGridColumn dataField="email"/>
  24. <mx:DataGridColumn dataField="password"/>
  25. <mx:DataGridColumn dataField="regDate" width="200"/>
  26. </mx:columns>
  27. </mx:DataGrid>
  28. <mx:HBox textAlign="center">
  29. <mx:Button id="deleteButton" label="删除" click="deleteUser();"/>
  30. </mx:HBox>
  31. </mx:Panel>
  1. package com.superwulei.view
  2. {
  3. import com.superwulei.ApplicationFacade;
  4. import com.superwulei.model.UserProxy;
  5. import com.superwulei.view.components.UserList;
  6. import flash.events.Event;
  7. import org.puremvc.as3.patterns.mediator.Mediator;
  8. public class UserListMediator extends Mediator
  9. {
  10. private var userProxy:UserProxy;
  11. public static const NAME:String = "UserListMediator";
  12. public function UserListMediator(viewComponent:Object)
  13. {
  14. super(NAME, viewComponent);
  15. userList.addEventListener(UserList.USER_DELETE,onDelete);
  16. userProxy = facade.retrieveProxy(UserProxy.NAME) as UserProxy;
  17. userList.users = userProxy.users;
  18. }
  19. private function get userList():UserList{
  20. return viewComponent as UserList;
  21. }
  22. /* 删除用户监听器 */
  23. private function onDelete(event:Event):void{
  24. deleteUser();
  25. }
  26. /*删除用户方法*/
  27. private function deleteUser():void{
  28. sendNotification(ApplicationFacade.USER_DELETE,userList.selectUser);
  29. }
  30. }
  31. }

关于Mediator再补充一下,在每个Mediator中会看到有一个公有的静态的常量字符串,这个字符串用来表示Mediator的类名。同样的在Proxy和Command中你也会看到,这样就可以通过facade的retrieveMediator、retrieveProxy和retieveCommand来检索对象。

关于Model层要记住:一个MXML可视控件对应一个Mediator,Mediator本身不处理操作但它会发送Notification(发送出去的Notification会自动被执行),关于界面上的操作采用监听的方式即addEventLisentner。

pureMVC简单示例及其原理讲解三(View层)的更多相关文章

  1. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  2. pureMVC简单示例及其原理讲解二(Model层)

    本节将讲述Model层. Model层有VO和Mediator组成,非常简单,仅仅包含两个类:UserVO和UserProxy. UserVO中的构造器用于初始化用户的添加(通过email和密码),另 ...

  3. pureMVC简单示例及其原理讲解五(Facade)

    本节将讲述Facade,Proxy.Mediator.Command的统一管家.自定义Facade必须继承Facade,在本示例中自定义Facade名称为ApplicationFacade,这个名称也 ...

  4. pureMVC简单示例及其原理讲解一(开篇)

    pureMVC是一个MVC框架,皆在最大限度的减少MVC间的耦合性.本人刚刚接触pureMVC时感到一头雾水,不知从何入手,也不知道从何学习.好在本人有耐性且能看懂英文技术文档,面向对象的编程能力也比 ...

  5. Optaplanner规划引擎的工作原理及简单示例(2)

    开篇 在前面一篇关于规划引擎Optapalnner的文章里(Optaplanner规划引擎的工作原理及简单示例(1)),老农介绍了应用Optaplanner过程中需要掌握的一些基本概念,这些概念有且于 ...

  6. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  7. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  8. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  9. CNN(卷积神经网络)原理讲解及简单代码

    一.原理讲解 1. 卷积神经网络的应用 分类(分类预测) 检索(检索出该物体的类别) 检测(检测出图像中的物体,并标注) 分割(将图像分割出来) 人脸识别 图像生成(生成不同状态的图像) 自动驾驶 等 ...

随机推荐

  1. Base64编码Java实现

    一.什么是Base64编码 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一.Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输. 由于一些二进制字符在 ...

  2. IFields Interface 定义一个字段集合对象

    Description The Fields object represents a collection of columns in a table. The term field is synon ...

  3. CodeForces 614A Link/Cut Tree

    #include<cstdio> #include<cstring> #include<cmath> #include<stack> #include& ...

  4. 关于python 函数参数

    函数参数:必选参数.默认参数.可选参数.关键字参数 1.默认参数 默认参数可以简化函数的调用.设置默认参数时,有几点要注意: 一是必选参数在前,默认参数在后,否则Python的解释器会报错: 二是如何 ...

  5. postgresql 数据库的备份和恢复 (pg_dump 和 pg_restore)

    pg_dump 用来备份数据库: pg_restore 用来恢复数据库: 备份出来的文件可以用 XZ (linux 自带的压缩工具压缩). XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您 ...

  6. DMLC深度机器学习框架MXNet的编译安装

    这篇文章将介绍MXNet的编译安装. MXNet的编译安装分为两步: 首先,从C++源码编译共享库(libmxnet.so for linux,libmxnet.dylib for osx,libmx ...

  7. Quick Cocos2dx 与 Eclipse 连真机debug遇到的问题

    今天下午解决了因为偷懒一直忍受的两个让我不爽很久了的问题: 1Eclipse无法连接手机调试的问题. 在设备管理器中看到的Android设备有黄色的感叹号, 说明驱动不是最新的. 按照网上搜到的解决方 ...

  8. [python]小练习__创建你自己的命令行 地址簿 程序

    创建你自己的命令行 地址簿 程序. 在这个程序中,你可以添加.修改.删除和搜索你的联系人(朋友.家人和同事等等)以及它们的信息(诸如电子邮件地址和/或电话号码). 这些详细信息应该被保存下来以便以后提 ...

  9. Identifying Dialogue Act Type

    Natural Language Processing with Python Chapter  6.2 import nltk from nltk.corpus import nps_chat as ...

  10. github 更新fork分支

    在github上开发代码的时候我们习惯的是fork一个分支,然后修改再往主分支push request,这样就可以保证多人开发, 但是随着时间的推移,自己fork的版本和主分支的版本差异越来越大; 这 ...