zoukankan      html  css  js  c++  java
  • 二、敏捷开发框架-编辑页面模型-EditPage

    敏捷开发框架:编辑页面模型 

     

    编辑页面的开发:

    下面以用户管理为例子,进行分析

    image.png

    如上图,就是我们典型的编辑画面

    特点是:上面一排功能按钮

    中间是:表单

    主要实现数据的编辑、加载、查看、保存、新增 等功能

     

    页面DOM结构如下:

    image.png

    从上到下依次看

    eci-page-edit 表示当前页面是编辑页面

    head 头部 主要放功能按钮,class是 toolbar 如果想要背景为灰色 就增加 eci-gray-bg

    eci-edit-area 编辑区  采用编辑区 自适应窗体高度设计  class 加 fit

    footer 底部,用来显示操作页面的提示信息

     

    编辑的画面功能包括

    编辑数据加载

    保存

    新增

     

    代码如何开发:

    image.png

        使用 EditPage初始化当前编辑页面

        同查询页面一样重要的是 keyField 主键

        这里只要设置 

        loadApi  用来查询当前编辑的数据显示在表单上

        saveApi 用来保存

     

       page.tryLoad( )方法  对应的 EditPage类里面 提供了 load方法

       load方法的含义是  根据keyValue查询数据

       tryLoad 主要是考虑,我们新增画面和编辑画面是同一个画面

       这里调用 tryLoad 里面会自动识别当前打开画面是新增还是编辑

       如果是新增就不调用任何后台,如果是编辑,则自动从URL地址中获取当前页面的主键值

       加载到EditPage 的 keyValue中,同时记录到页面的主键DOM中。

       

       通过上述两行代码就实现 编辑页面的所有功能了。

       

       编辑数据加载

       保存     默认ID btnSave  也可以指定  saveId

       新增     默认ID btnAdd   也可以指定 addId

     

    image.png

    点击保存,效果如上图。

    一般情况下不需要些任何代码。

    用户编辑画面的场景,有点特殊,在新增的时候,那能够选择员工,当变成修改的时候,控制员工放大镜不能选择

    image.png

    上图演示的是新增时,人员放大镜可以选择。

    保存后,放大镜不能选择了,这要怎么做。

    按照正常这不应该是个问题,保存后控制下呗。在这里的确是个问题了。

    为啥,因为我没有写任何代码就实现了保存,那我们如何应对上面提到的这个问题呢。

     

    image.png

       如上图:提供saved回调函数,接管了 保存后的处理逻辑

       但是同时保留了 默认回调函数的 消息提示功能。

       这样的设计是为了各司其职,通力协作。

       本能造成下面的困扰:

       默认回调函数内置了 保存成功后的消息提示,这样业务代码就免得写了。

     

      但是在特殊情况下,业务代码需实现自己的回调函数,自己实现回调函数的目的是要加入自己的业务逻辑

      比如上例的,我们要控制 某个控件的只读属性,但是我要是需要框架帮忙保存,消息提示功能

      不至于我为了实现另外一个功能,迫不得已增加另外一个段代码实现已经有的功能,这就是副作用。

      

      好的,框架尽最大的可能实现你的需要,让你部分接管回调处理过程。

      你负责处理你的,处理完了,流程继续交给框架来做,这时候框架帮你实现消息的弹出提示功能。

      OK,达成协议。就这么干。

     

      事实上上述的设计不够完善。

      只是考虑到了绝大数的情况,是要求消息提示由框架来做的情况。

      那思考下,有没有一种情况下,业务代码希望全权接管回调处理过程,不要框架帮我做消息提示的情况呢。

      答案是 肯定会有,那种情况下怎么办呢。

      上代码:

    image.png

      通过设置 response.cancel=true 来取消框架的代码执行,满足极少部分特殊情况的灵活性。

     

     

    好的,保存功能我们实现了

    image.png

    接下来我们来实现新增功能的代码

    默认已经实现了,只要是你的 按钮ID 是 btnAdd 就可以了。

     

    EditPage页面内置了 add 方法

    下面说说特别的情况:

    image.png

    如上图,这里的新增 btnAdd 我们给这个按钮增加了事件 addAction

    虽然,按钮ID 还是叫 btnAdd  因为你给它加了事件,那么框架就不管了,全权交给你了

    你为什么要这么做呢,肯定是有原因的。

    例如:我的原因

    是想在 新增的时候又将 员工放大镜设置成 可选择的模式。(框架的代码可管不了这么个性的需求

    只能管标准的、统一的处理方式,新增,就全部设置成空)

     

    image.png

    那好因为有特殊的需要,所以需要业务代码来接管处理过程。

    框架将add方法包装成独立的方法,这个时候在自己的业务代码中依然可以调用 add方法实现基本功能

    +自己的代码块,通过这样的方式来协同。

    是不是灵活有方便。

     

    至此新增的功能我们就完成了。

    没有特殊情况一行代码都不要,只要ID 命名成 btnAdd 即可

    面对特殊的要求时,代码也非常简便

     

    继续:实现后面的功能

    image.png

    回顾一下,QueryPage页面的开发介绍

    这个功能是不是一样,只是在不同的画面上,不同的表现形式

    一个是编辑画面,一个是列表行内事件

    image.png

     

     

    在编辑画面上,我们将查询页面的这两行代码拷贝过来

    image.png

    image.png

    一样的代码,不做任何修改,功能完全没有问题

    明明是不一样类型的画面,最起码,如何取参数都应该是不一样的吧。

    这就是 EciAction动作模型的强大之处。

     

    如上功能是没有任何问题,但是总感觉这个界面比较小,不利于操作。

    因为本身用户编辑窗口是弹出的小窗口,那么在内部弹出肯定不好看。

    怎么办?在父窗体中弹出

    代码怎么写

    image.png

     

    点击试试:

    image.png

    同样标题也出来了。

     

    这个窗体是怎么弹出的呢

    请求者是编辑画面     在列表页中通过 eci.open layer弹出     目标页面  UserRole画面

    这里涉及   调用者、执行者、目标窗体   三者这间的关系

    关于三者之间的信息交互 后面会专题介绍  《ECI弹窗交互设计》

    先记住有这个三个概念,便于后续交流。

     

     

    最后介绍下

    页面结构中的 footer 的作用是啥

    image.png

     如下图:我们放置的是 tipContent 内容块  

     提示内容

     

     

    image.png

     

    开发人员怎么写:

    image.png

    如上图,只要在 控件上 加  data-tip属性即可,怎么动态显示到 状态栏上的,由框架统筹控制!

     

     

     

     

    ========================================================================

    至此 EditPage 画面在用户编辑的使用 介绍就到此

    其实其它对象的保存,都是一样的。

     

    下面截图看下,角色编辑画面的代码,对比下

    首先视图

    image.png

    页面初始化:

    image.png

    打开这个编辑页面,如果是新增的时候,将所有依赖 主键的按钮例如  复制、复制权限,设置用户等按钮 失效

    page.saved 回调函数,控制当页面保存成功后,将 相关按钮 启用。

     

    image.png

    下面两行是实现【分配权限】、【设置用户】的代码

    image.png

    大部分的行为代码实现 控制在一行上,兑现了 EciAction 的设计目标(尽量通过最少的代码把功能实现)

     

  • 相关阅读:
    zoj1942Frogger
    阿里云api调用做简单的cmdb
    约瑟夫环
    Bag标签之中的一个行代码实行中文分词实例3
    用lua扩展你的Nginx(整理)
    Single Number III
    TCP/IP ---分层
    TCP/IP --概述
    adb命令学习
    How to set Selenium Python WebDriver default timeout?
  • 原文地址:https://www.cnblogs.com/godmodel/p/13029084.html
Copyright © 2011-2022 走看看