# vita-plus **Repository Path**: YiviS/vita-plus ## Basic Information - **Project Name**: vita-plus - **Description**: vita-plus是围绕spring mvc和组件构成的一个异想天开的前端框架,主要体现在开发套路的改变。它集成了多个开源框架和工具包,辅以自主研发的功能,给了开发们一个不一样的体验。同时,vita-plus还实现了一种另类的客户端自适应方式。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 8 - **Created**: 2019-01-03 - **Last Updated**: 2022-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vita-plus 前端框架 # ---------- ## 简介 ## vita-plus是围绕spring mvc和组件构成的一个异想天开的前端框架,主要体现在开发套路的改变。它集成了多个开源框架和工具包,辅以自主研发的功能,给了开发们一个不一样的体验。同时,vita-plus还实现了一种另类的客户端自适应方式。 ## 开发依赖 ## - spring mvc - velocity - jsoup - UserAgentUtils - jquery - underscore(可选) - backbone(可选) ## 开发套路 ## 写一个html:
这里是首页
这是做一个$options.text
然后写一个js: (function(vita){ var homepage = vita.Backbone.BizView.extend({ events : { "click a" : function(){ this.callService("indexClick", function(txt){ alert(txt); }); } } }); vita.widget.register("homepage", homepage, true); })(window.vita); 再写一个java: @Component("vita.homepage") public class Homepage extends AbstractComponent{ public Map achieveData(Object... params) throws Exception { Map options = new HashMap(); options.put("text","开发套路"); return options; } public String indexClick() throws Exception { return "您点击了首页!"; } } 最后写一个controller的服务: @RequestMapping(value = "homepage") public String homepage(HttpServletRequest request, Model m) throws Exception { Map options = achieveData("homepage"); return initView("homepage", "首页", options, m, request); } 当访问homepage这个服务的时候,浏览器会渲染出: 这里是首页 这是做一个开发套路 当点击`首页`时,会alert提示`您点击了首页!`。 ## 交互示意 ## ![](http://i.imgur.com/AbX3g1J.png) > - “组件对象”是模块的java bean部分,可以从服务层获取数据,并加以处理成模版所需的数据 - “模版视图”是模块的html部分,是界面模版 - “模版处理”是vita-plus框架部分,这里主要处理html上的事件绑定(js) - 数据和模版由spring的控制层交给velocity完成界面的组装,再由vita-plus框架完成事件绑定,完成界面初始化 ![](http://i.imgur.com/gpYnnfK.png) ## 实现思路与方案 ## - 需要模块化设计、开发,在整体把控的情况下,将应用划分成独立的模块进行设计和开发 - 每个功能模块均由html、js、java bean三部分的组件组成,分别处理界面模版、界面事件逻辑、界面数据,即,模块 = html组件 + js组件 + java组件 - 模块之间引用可按html、js、java bean组件分别引用,原则上,模块引用时,各类型组件需要分别引用对应类型的组件 - 由vita-plus框架提供的控制器统一管理模块的三部分组件,实现html上的事件处理(js),实现js和后端服务(java)的交互和数据处理 - js组件可以继承,可以在核心组件的基础上进行本地化 - 利用velocity的自定义指令,实现模块的html组件,允许引用其他模块的html,并且加载对应的js组件和css部分(如果css有按模块划分的话) - 利用spring实例化模块的java bean组件,并加载在spring容器中 - 利用spring mvc和velocity,将模块的html(模版)和java(数据)部分,在服务端生成界面交给浏览器渲染,减少js对数据和界面渲染的逻辑量 - 在vita-plus框架里,实现模块的html(模版)和js(逻辑、事件)组件的绑定 - 在vita plus框架里,实现模块的js(逻辑)和java bean(数据)组件的数据通信 - 实现模块以及模块实例生命周期管理(组件注册、实例化、模块化、使用、销毁等) ## 与一般开发差别 ## 1. 模块化设计(重要)、开发,每个模块可以分成html、js、java三个部分,放弃js与html混合、js请求controller的模式 2. 使用布局容器,每个html无需关注通用资源的引入,只关心自身使用的一些特定资源。以便尽可能减少重复资源的加载 3. 在继承backbone视图和模型基类的基础上,抽象了一系列方法,形成业务上使用的一个基类,每个js都要继承这个基类开发 4. 涉及到受理报文的,就在基类上设计报文对象,则每个继承该基类的js组件共享该数据,避免业务数据的传递 5. 每个模块,除了入口写在controller里,其他代码只需要在模块自身的js、html、java里编写,无需关注其他文件。移植模块时,只要移植入口和相关文件即可 6. 本地化:html无需继承,可在本地工程直接覆盖;js可以继承,也可以覆盖,继承方式文件名加extend,比如cashier.js,继承文件名为cashier.extend.js;java直接继承 7. html和js,资源与路径无关,预加载到服务器内存中,因此要求在指定范围内,文件名不能重复,重复即覆盖 ## 对backbone的扩展 ## 1. initialize是backbone的初始化方法,但是backbone没有提供抽象方法做统一的初始化操作,或者提供组件内私有初始化接口。js组件基类则将initialize作为统一的初始化操作,组件内私有的初始化方法调整为_initialize 2. remove是backbone的销毁方法,但没有提供组件内私有销毁方法。js组件基类增加了destroy方法作为新的销毁方法(该方法先调用_destroy再调用remove),并且提供了_destroy方法作为组件私有的销毁方法。案例:取消填单后要释放已占用的资源,此时资源释放逻辑可以写在_destroy里,在组件销毁(destroy)前会先释放资源,而无需开发注意逻辑顺序 3. 提供singleton设置是否单例,如果设置为单例(工具),每次通过require出来的实例都是同一个,如果设置多例(UI),则require出来的将是构造函数(不可见),需调用.new({})方法来生成实例 4. 增加evaluate方法,合并model和view,默认backbone要自己实现,可重写 ## 第一章 框架能力 ## ### 第一节 js基础能力 ### 该框架在js方面,提供了以下能力: > 1. `核心`:基础函数实现,核心能力不依赖第三方 2. `执行队列`:以生产和消费消息体的方式,实现js函数的执行队列,支持队列分类管理 3. `事件侦听`:以发布订阅的方式,实现在对象上的事件侦听,支持事件注册、监听、派发,事件派发处理使用了`执行队列` 4. `切面`:支持js对象和dom对象的事件/方法切面处理,支持事件前、事件后、事件前后处理 5. `ajax`:封装$.ajax以及$.fn.load方法,实现404、500等异常处理,实现统一遮罩等 6. `路由`:管理history(不是浏览器的history),可以判断是程序切换,还是前进后退按钮,并且可以限制路由变化 7. `组件框架`:js组件框架实现,组件可继承,并且维护组件极组件实例的生命周期(组件注册、注销、实例化、使用、销毁等),实现了js组件基类、js ui组件基类、js backbone组件基类、js biz业务组件基类 8. `模块`:js组件模块化封装,隐藏js组件的属性和私有函数,支持与seajs和requirejs模块的相互调用 ### 第二节 js功能组件 ### 框架提供了以下js功能组件: > - 封装underscore工具,按使用对象拆解成`util`、`objectUtil`、`functionUtil`、`domUtil`、`collectionUtil`、`chain`、`arrayUtil`模块 - 封装bootstrap,按bootstrap组件分类解析成`input`、`container`、`inlineText`等等,支持主题切换 - datetime组件,主要用于移动端的时间选择 - dialog组件,对话框 - loading组件,遮罩 - popup组件,提示框 - moveTo组件,移动动画 - webAssist组件,用来支撑流程,利用锚点实现界面跳转(开源框架称之为路由router),实现单界面应用的后退和前进、遮罩等 - 提供js组件基础类,提供模块刷新、服务访问等公共能力 ### 第三节 html功能组件 ### 框架提供了两个html布局容器,一个独立访问模块时使用,另一个在流程中使用 > - widgetContainer.html是模块容器 - assistContainer.html是流程容器 - include.html是公共资源容器 - 以上均可自定义 ### 第四节 模版资源加载器 ### 框架希望在开发时,所需的资源与路径无关,所以需要将资源加载到内存中 ### 第五节 终端适配 ### 根据访问服务的终端,推送适配终端的模版 ### 第六节 velocity自定义指令 ### 通过velocity自定义指令,实现html、js、css资源的按需加载 ### 第七节 java组件 ### 配置资源与路径无关的目标,实现了一系列的java方法和接口,用来数据处理或者与服务端的数据交互 ## 第二章 首次使用 ## ### 第一步 依赖vita-plus ### 在pom.xml中做以下依赖: com.ai vita-plus 1.0.8 ### 第二步 加载vita-plus配置 ### 在spring配置文件中,引入以下xml: ### 第三步 加载velocity配置 ### 在spring配置文件中,引入以下bean配置,将使用velocity作为视图解析器: utf-8 utf-8 com.ai.vita.velocity.directive.WidgetCreate 如果已有该配置,则做以下配置: - 在`resourceLoaderPath`属性里增加`classpath:com/ai` - 在`velocityProperties`增加`com.ai.vita.velocity.directive.WidgetCreate` > `com.ai.vita.velocity.directive.WidgetCreate`是自定义velocity指令 ### 第四步 资源加载配置 ### 该框架的资源取自于内存,所以配置所需资源的加载配置,在spring配置文件中增加以下bean配置: com/al/crm/superSo > - `realTime`是boolean类型,表示是否实时更新资源,必须设置 - `resourcePaths`是String[]类型,用来存放所需加载资源的路径,至少指定一个路径 - `subDirectory`是boolean类型,表示是否包含子目录,必须设置 - `filter`是String类型,用来存放资源的过滤,多个过滤使用英文逗号分隔 - `minified`是boolean类型,表示是否使用minified资源 - `minifiedExt`是String类型,用来存放minified资源的标识,如果不设置默认为min - `properties`是Map类型,用来存放各种设置属性,目前实现scriptType,用来设置script标签中的type ### 第五步 添加第一个控制器 ### 创建一个控制器,继承`com.ai.vita.ApplicationController`,在构造函数里设置以下属性: setAssistContainer("superSo/frame/assistContainer"); setWidgetContainer("superSo/frame/widgetContainer"); setServicePath("../superSo"); setClassifications(MDA.classificationsMap); > - `setAssistContainer`用来设置界面切换用的布局容器,不设置将使用框架自带的布局容器 - `setWidgetContainer`用来设置模块界面使用的布局容器,不设置将使用框架自带的布局容器 - `setServicePath`用来设置服务路径,将供js组件使用,一般设置成当前控制器的RequestMapping,也可以是其他控制器的RequestMapping,只要是继承了`com.ai.vita.ApplicationController`或者`com.ai.vita.AbstractController`的控制器都行,不设置将抛出异常 - `setClassifications`用来设置模版分类,可根据终端类型推送设置好的模块模版,不设置则不区分终端,可以设置的key有Computer、Mobile、Tablet - 该控制器里,只需要编写界面入口 ### 第六步 添加第一个模块 ### 以首页为例,模块命名为homgpage: > - 创建html组件,文件名约定为:homepage-tpl.html - `data-widget`标识为依赖的js组件名
这里是首页
> - 创建js组件,文件名约定为:homepage.js - `vita.Backbone.BizView`是基于backbone的view封装扩展的一个view基类,所有的js组件都需要继承它来开发 - `events`是backbone提供的事件侦听配置 - backbone提供的组件初始化方法是initialize,该方法被vita用来处理框架逻辑,组件私有初始化方法改为`_initialize` - `vita.widget.register("homepage", homepage, true)`这里是把js组件注册到vita的容器管理,true表示需要生成名为homepage的jquery插件,即增加$.fn.homepage方法,以供jquery对象直接访问组件里的方法 (function(vita){ var homepage = vita.Backbone.BizView.extend({ events : { }, _initialize : function(){ } }); vita.widget.register("homepage", homepage, true); })(window.vita); > - 创建java组件,文件名约定为:Homepage.java - 必须要继承`com.ai.vita.AbstractComponent` - beanId约定为`vita.homepage` - 必须要实现`Map achieveData(Object... params)`,该接口用来组件数据准备,供html组件使用,这个接口供界面入口调用,也可以被其他模块的java组件调用 @Component("vita.homepage") public class Homepage extends AbstractComponent{ public Map achieveData(Object... params) throws Exception { Map options = new HashMap(); return options; } } > - 在控制器里创建界面入口,RequestMapping约定为`homepage` - 通过`achieveData`方法,初始化组件数据,第一个入参是模块名 - 通过initView方法,处理模版和数据,入参分别为:模块名、显示名称(title)、数据、Model、HttpServletRequest @RequestMapping(value = "homepage") public String homepage(HttpServletRequest request, Model m) throws Exception { Map options = achieveData("homepage"); return initView("homepage", "首页", options, m, request); } > 以上完成了一个完整的模块开发,可以使用`/控制器/homepage`路径进行访问 ### 第七步 添加第一个流程 ### 一个模块开发完,是不能进行界面切换的,需要创建一个流程来实现界面间的切换。 流程,可以认知为,是为了实现某个业务目的的一个模块集合,通过这个模块集合里的模块切换,协同支撑了该业务目的的实现。 以命名为main的流程为例: > - 创建一个js文件,约定命名为:main-assist.js - `assist`是一个变量,将被框架捕捉 - `prototype`属性,指定一个类的原型,将被框架捕捉,即,只有继承该原型的组件,才会被框架识别 - `nodes`属性,指定该流程的模块集合 - `name`属性,指明节点名称,约定为模块名 - `url`属性,指明节点界面入口,即上节内容里的控制层服务地址 - `assist`属性,js组件里assist接口的具体实现,用来请求某个模块,来获取并处理数据 - `end`属性,js组件里end接口的具体实现,用来交出界面控制权 - `assist`和`end`的实现,都需要一个return,其完整的返回值格式为`[ [ 目标节点名称 , 参数 , 是否刷新 ] , [ 回调函数 , 回调函数调用对象 ] ]` var assist = { prototype : "vita.Backbone.BizView.prototype", nodes : [ { name : "homepage", url : "../superSo/homepage", assist : function(){ return [["partyQuery", true], function(data){ console.info(data); history.back(); }]; }, end : function(){ } }, { name : "partyQuery", url : "../superSo/partyQuery" } ] }; > 以上完成一个完整的的流程开发,意思是: > - 框架在该流程中只识别继承`vita.Backbone.BizView`的模块 - 该流程中,只有两个模块来支撑一个业务,分别为`homepage`和`partyQuery` - 在访问该流程时,默认将进入homepage界面(第一个节点) - 在homepage模块的js组件中,调用assist方法时,将请求partyQuery模块,并获取partyQuery模块的数据,然后返回homepage界面 - 使用`/控制器/vector?assist=main`进行访问 ## 第三章 深入开发 ## ### 第一节 基础能力 ### ### 第二节 js组件 ### js组件基类分为视图(view)和模型(model)两个,其中视图用来处理各种事件、小部分额外的界面渲染,而模型用来数据处理。 #### vita.Backbone.BizView #### BizView作为所有组件的视图基类,实现了以下方法,在其子组件内部可以通过this调用 ***refreshPart*** : 局部刷新,可以指定组件内部的一部分html进行刷新操作 this.refreshPart(methodName, params, selector, keyName, callBack, options); > - `methodName`指定需要调用的方法,该方法必须在js组件对应的java组件里存在的方法 - `params`指定调用`methodName`时送入的参数,类型建议是string或者json,如果需要传递多个入参,则可以将该参数设置为数组,数组长度必须与`methodName`的参数个数相同,否则会抛出异常 - `selector`指定选择器,即被刷新部分的容器,比如:"#offer",则被刷新的内容就是id为offer的html对象里面的内容 - `keyName`指定key值,即模版里使用的$options的key,用于模版取值。如果`methodName`的返回值是map类型,则该参数无效,可不送入,返回值的key将与$options的key对应,调用可变成`this.refreshPart(methodName, params, selector, callBack, options)`;否则没有该参数将抛出异常。 - `callBack`指定回调函数,用于`refreshPart`方法返回数据时的处理,该回调函数可通过第一个形参获取到`refreshPart`方法的返回数据,如`function(re){}`。注意:`refreshPart`的返回值是已经拼装完成的html的字符串,可使用$()转成jquery对象。 - `options`指定ajax的参数,参数值参考$.ajax,另外增加了mask属性,用来启用遮罩,如`{mask : true}` ***increasePart*** : 局部增加,可以指定组件内部的一部分html进行累加操作 this.increasePart(methodName, params, selector, keyName, callBack, options) > - `methodName`指定需要调用的方法,该方法必须在js组件对应的java组件里存在的方法 - `params`指定调用`methodName`时送入的参数,类型建议是string或者json,如果需要传递多个入参,则可以将该参数设置为数组,数组长度必须与`methodName`的参数个数相同,否则会抛出异常 - `selector`指定选择器,即被刷新部分的容器,比如:"#offer",则被刷新的内容就是id为offer的html对象里面的内容 - `keyName`指定key值,即模版里使用的$options的key,用于模版取值。如果`methodName`的返回值是map类型,则该参数无效,可不送入,返回值的key将与$options的key对应,调用可变成`this.increasePart(methodName, params, selector, callBack, options)`;否则没有该参数将抛出异常。 - `callBack`指定回调函数,用于`increasePart`方法返回数据时的处理,该回调函数可通过第一个形参获取到`increasePart`方法的返回数据,如`function(re){}`。注意:`increasePart`的返回值是已经拼装完成的html的字符串,可使用$()转成jquery对象。 - `options`指定ajax的参数,参数值参考$.ajax,另外增加了mask属性,用来启用遮罩,如`{mask : true}` ***refreshView*** : 刷新视图 this.refreshView(params, callBack, options) > - `params`指定刷新时送入的参数,类型建议是string或者json,如果需要传递多个入参,则可以将该参数设置为数组,数组长度必须与java组件中`achieveData`方法的参数个数相同,否则会抛出异常 - `callBack`指定回调函数,用于`refreshView`方法返回数据时的处理,该回调函数可通过第一个形参获取到`refreshView`方法的返回数据,如`function(re){}`。注意:`refreshView`的返回值是已经拼装完成的html的字符串,可使用$()转成jquery对象。 - `options`指定ajax的参数,参数值参考$.ajax,另外增加了mask属性,用来启用遮罩,如`{mask : true}` ***callService*** : 服务访问,仅访问对应的java组件里的服务(js里只能访问java组件里的服务,不允许方法controller,为的是服务与controller解绑,便于模块移植) this.callService(methodName, params, callBack, options) > - `methodName`指定需要调用的方法,该方法必须在js组件对应的java组件里存在的方法 - `params`指定刷新时送入的参数,类型建议是string或者json,如果需要传递多个入参,则可以将该参数设置为数组,数组长度必须与java组件中`methodName`方法的参数个数相同,否则会抛出异常 - `callBack`指定回调函数,用于`callService`方法返回数据时的处理,该回调函数可通过第一个形参获取到`callService`方法的返回数据,如`function(re){}`。 - `options`指定ajax的参数,参数值参考$.ajax,另外增加了mask属性,用来启用遮罩,如`{mask : true}` ***addListener*** : 增加侦听,在接收到事件时促发,一般用于不同模块之间的交互 this.addListener(eventName, func) > - `eventName`指定需要侦听的事件名,在接收到该事件时促发func - `func`指定促发事件时需要执行的逻辑,可通过形参接收到事件所附加的数据 ***removeListener*** : 删除侦听 this.removeListener(eventName, func) > - `eventName`指定需要删除的事件名 - `func`指定需要删除事件逻辑,如果不送,则删除该事件下的所有逻辑 ***dispatchEvent*** : 事件派发,一般用于不同模块之间的交互 this.dispatchEvent(widget, eventName) this.dispatchEvent(eventName, data...) this.dispatchEvent("vita.widgetName", eventName, data...) this.dispatchEvent("#id1,id2", eventName, data...) > - `widget`指定接收事件的组件,可不指定;不指定时,所有侦听了`eventName`事件的组件都将接收到事件;指定时,可以加vita.前缀标识使用了vita框架的组件,或者可以加#标识组件实例的id,需要指定多个组件时,可以用,分隔 - `eventName`指定事件名,必须指定 - 可以在`eventName`后增加参数,作为事件附加数据 ***popup*** : 弹窗1,用于alert、confirm this.popup(info, baseFunction, extFunction) > - `info`指定提示信息 - `baseFunction`指定点击“确定”时的事件 - `extFunction`指定点击“取消”时的事情 - 注意:没有或者只有baseFunction时,`popup`显示为alert模式;同时存在`baseFunction`和`extFunction`时,`popup`显示为confirm模式 ***dialog*** : 弹窗2,用于对话框、需要填写内容等 this.dialog(id) this.dialog(options) > - `id`指定id,用于打开已经使用id生成过dialog的场景 - `options`指定生成新dialog的参数,是一个json结构,说明如下: - `options.id`指定dialog的id,可不指定,若指定id并且destroy值为false时,下次可通过id使用该dialog - `options.title`指定dialog的标题,可不指定 - `options.url`指定dialog需要加载的url,优先级比`options.content`高 - `options.params`指定dialog加载url时需要传递的参数,为json结构 - `options.content`指定dialog需要加载的内容,优先级比`options.url`低 - `options.buttons`指定dialog需要生成的按钮,结构为json或者json数组,可以设置三个属性:`class`指定样式,`text`指定按钮名称,`click`指定按钮事件 - `options.onClose`指定dialog在关闭时需要触发的事件 - `options.onCancel`指定在取消dialog时触发的事件,如dialog自身的“关闭”按钮 - `options.destroy`指定dialog在关闭的时候是否销毁,需是boolean值 - `options.autoClose`指定dialog在触发按钮事件后,是否需要自动关闭窗口,需是boolean值 ***assist*** : 请求协助,一般用于请求其他模块的数据,类似服务调用;在组件里,只是描述为一个接口,在界面流转时才会有真实逻辑 this.assist(flag, data, callBack) > - `flag`指定一个描述,用于描述一个需要请求的模块名,该模块名可以真实存在,也可以是虚拟描述 - `data`指定在请求`flag`模块时,需要传递的参数,建议为json - `callBack`指定请求`flag`模块后,用来接收`flag`模块输出的数据的处理函数,如`function(re){}` ***end*** : 当前模块逻辑结束描述,一般在明确当前模块的逻辑全部处理完,需要把焦点传递给其他模块时调用,表明当前模块逻辑结束;在组件里,只是描述为一个接口,在界面流转时才会有真实逻辑; this.end(flag, data, special) > - `flag`指定一个描述,用于描述下一个接收焦点的模块名,该模块名可以真实存在,也可以是虚拟描述 - `data`指定在移交焦点给`flag`模块时,需要传递的参数,建议为json - `special`指定特殊处理标识,当前有两类特殊处理,一类是强制移交,值为vita.REDIRECT;另一类是移交给上级界面流转描述,值为vita.OUT_OF_FOCUS ***refreshSession*** : 更新session,用于员工信息、渠道更新(可按需重写) this.refreshSession(session) > - `session`指定要更新的session值,json类型 ***removeSession*** : 清除session(可按需重写) this.removeSession() ***refreshParty*** : 更新session中的客户信息(可按需重写) this.refreshParty(party, reset) > - `party`指定要更新的party值,json类型 - `reset`指定是否需要重置,重置会清除原有全部信息,再用`party`赋值,如果不重置,只会重置`party`里有的值,其余值保留 ***removeParty*** : 清除session中的客户信息(可按需重写) this.removeParty() #### vita.Backbone.BizModel #### BizModel作为所有组件的模型基类,暂无扩展 ### 第三节 html组件 ### html组件上提供的能力主要分为两类:一类是velocity自定义指令;一类是html自定义标签 #### $options #### html组件里统一的取数据入口,所有送到html组件的数据,统一由$options取出 $options.offerSpec #### #widgetCreate #### velocity自定义指令,在html里引用组件,可以加载html组件、对应的js组件、对应的本地js组件、对应的css,实现按需加载 #widgetCreate(widgetName, data) > - `widgetName`指定要加载的模块名称 - `data`指定传递给`widgetName`的数据 #### #### html自定义标签,提供数据附加能力,将该标签里的数据,附加到指定的html对象上,再通过jquery的data方法取出使用 {"partyId":123456} > - `for`属性指定html对象的id,即把标签内的数据附加到指定id的html对象上 - `data`指定附加的数据,建议为json,如果是json,则附加到html对象上的key将等同与json里的key;如果不是json,会将数据以`vita-data`为key,附加到html对象上;上例中调用$("#test").data("partyId") => 123456 123456 > - 没有指定`for`属性时,优先将该标签的前一个标签作为附加数据的html对象 - `data`指定附加的数据,建议为json,如果是json,则附加到html对象上的key将等同与json里的key;如果不是json,会将数据以`vita-data`为key,附加到html对象上;上例中调用$("#test").data("vita-data") => 123456
{"partyId":123456}
> - 没有指定`for`属性时,并且没有前一个标签时,将该标签的父级标签作为附加数据的html对象 - `data`指定附加的数据,建议为json,如果是json,则附加到html对象上的key将等同与json里的key;如果不是json,会将数据以`vita-data`为key,附加到html对象上;上例中调用$("#test").data("partyId") => 123456 #### #### html自定义标签,提供数据绑定能力,将指定的html对象与js组件里的model做绑定,并且将标签内的数据作为默认值。model值变化时将作用到html对象,html对象值变化时将作用到model。 123456 > - `for`属性指定与model绑定的html对象的id - `mapper`属性指定与model绑定的html属性 - `model`属性指定与model绑定的key - `action`属性指定一个html事件,在该事件触发时,去改变model - `data`指定默认值,可不指定 - 上述标签描述为:将#test(`for`)对象的value(`mapper`)属性,在触发input(`action`)事件时,写入到js组件model的data(`model`)里;在js组件的model的data(`model`)值被改变时,将改变后的值,写到#test(`for`)对象的value(`mapper`)属性;123456(`data`)作为data(`model`)和value(`mapper`)的默认值 123456 > - 没有指定`for`属性时,优先将该标签的前一个标签作为附加数据的html对象 - 没有指定`action`属性时,默认为输入事件,一般情况下,输入事件禁止显式设置,因为设置成input会有IE8的兼容性问题,不设置的话,框架会做兼容性处理 - 没有指定`mapper`属性时,如果html对象是输入型的,框架将默认为value;如果是不可输入型的,框架将默认成html - `model`必须设置,不设置该标签无效
123456
> - 没有指定`for`属性时,并且没有前一个标签时,将该标签的父级标签作为附加数据的html对象 - 没有指定`action`属性时,默认为输入事件,一般情况下,输入事件禁止显式设置,因为设置成input会有IE8的兼容性问题,不设置的话,框架会做兼容性处理 - 没有指定`mapper`属性时,如果html对象是输入型的,框架将默认为value;如果是不可输入型的,框架将默认成html - `model`必须设置,不设置该标签无效 ### 第四节 java组件 ### ### 第五节 流程 ###