iuap-design/blog

深入理解iuap design-12-情定kero

GuoYongfeng opened this issue · 1 comments

深入理解iuap design-12-情定kero
onvno commented

背景介绍

构建大型企业级应用的痛点:

  • 复杂单据
  • 控件复杂,不断扩展
  • 数据格式不固定,运行时动态调整

Kero如何解决这些问题

  • 数据模型可描述。

    kero 使用了描述性的代码风格定义数据模型。数据被存储在ViewModel中,通过数据模型进行访问和修改。

    var viewModel = {
        head : new u.DataTable({
            meta: {
                'pk_org': {
                    'required': true,
                    'associations': {
                        "pk_org": "name"
                    },
                    'associationMeta': 'uap.org'
                },
                'billnumber': {
                    'precision': 2,
                    'required': true,
                    'maxLength': 50
                }
            }
        })
    }
    
  • 统一可扩展的控件描述

    kero使用了描述性的风格来定义控件

    <input type="text" u-meta='{"type":"string", "data":"head", "field":"billnumber"}' />
    

    在普通 HTML 中使用kero语法将在指定DOM上创建控件,并与数据模型关联。一旦创建了关联,控件 将与数据模型同步。每当修改了数据,控件便相应地更新,修改了控件,数据模型也会相应的更新.

  • 数据模型可变

    数据格式可变使得无缝的数据修改称为可能, kero负责把不同控件的数据集中高效地组织并处理,视图层的控件会订阅数据模型及数据的变更,当数据变化时通知相应组件更新,并在客户端维护一份包含所有数据的数据缓存

Kero定位

Kero依托基于 MVVM 架构的 Knockout 类库,实现了将NeoUI控件库自由进行数据绑定的前端类库。主要解决问题:

  • 提供NeoUI完整样式,解决页面UE风格一致的问题
  • 提供了数据模型,实现数据与UI双向绑定,构建数据驱动型页面。解决具有复杂交互的页面开发问题。
  • 依托NeoUI控件库,给开发者带来一站式完整前端解决方案

Kero设计理念

  • 数据模型

    数据模型主要是对MVVM架构中的Model层做增强处理。主要功能有:

    • 以行、列的形式对数据做存储,并对外暴露一批增删改查的API,方便开发者对页面数据的处理,而且所有开发者之间做到统一,减少出错概率。
    • 数据增加状态标识新增或修改,方便开发者使用。
    • 具有分页缓存能力,可在前台处理分页(非必要情况下,不推荐前台分页)。
    • 具有事件触发器,把数据变化触发出去,供开发者监听使用。
  • 控件模型

    控件模型是为解决复杂交互页面中,业务逻辑对数据存在一系列处理需求而设计的。用来简化开发者对相关逻辑的开发。比如:数据的必填、数据的各种校验、数据的显示格式等。

起步

  1. 引入Kero文件及相关依赖

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>Kero Getting Started</title>
    </head>
    <body>
    
     <script src="http://design.yyuap.com/static/jquery/jquery-1.9.1.min.js"></script>
     <!--引入knockout依赖-->
     <script src="http://design.yyuap.com/static/knockout/knockout-3.2.0.debug.js"></script>
     <!--引入核心js文件-->
     <script src="http://design.yyuap.com/static/uui/latest/js/u.js"></script>
    </body>
    </html>
    

  2. 兼容IE8

    如需兼容IE8,需要在引入其他JS文件之前加载u-polyfill.js

    <!--[if lte IE 8]>
     <script src="http://design.yyuap.com/static/uui/latest/js/u-polyfill.js"></script>
    <![endif]-->
    
  3. 快速上手:绑定数据,实现hello world

    // JS
    var app,viewModel;
    
    /**
    * `viewModel = {...}`创建数据模型
    * `dt1` 创建名为`dt1`的`u.DataTable`数据集
    * `f1` 创建名为`f1`的字段,为`dt1`数据集的一个子集
    */
    viewModel = {
       dt1: new u.DataTable({
           meta:{
               f1:{
                   type:'string',
                   maxLength:12
               }
           }
       })
    };
    
    /**
    * `app = u.createApp({...})`,页面初始化,创建框架服务
    * `el` 指定服务对应的顶层DOM
    * `setValue`进行赋值操作
    */
    app = u.createApp({
       el:'body',
       model:viewModel
    });
    
    var r = viewModel.dt1.createEmptyRow();
    r.setValue('f1','Hello World');
    
    /**
    * getValue 获取字段对应的值
    */
    var demoDiv = document.getElementById('demo_div');
    var dtVal = viewModel.dt1.getValue('f1');
    demoDiv.innerHTML = dtVal;
    
    <!-- HTML -->
    <div id="demo_div"></div>
    

API及示例