这个题目有点让人迷惑,我就简单说明下,比如你要做一个表单数据保存的功能,这个表单(不是<form>,只是代表业务上的概念)可能分4、5步骤,每一个步骤里可能有10-20甚至50个属性,其中有10个属性是列表形式,而且很多select/checkbox/radio/tr等dom对象都是根据业务规则动态生成的,同时后面的步骤的页面根据前些步骤的数据变化。。。==反正就是在javascript做OO建模也相当复杂就是。面对这样的需求,我把我们项目中的设计实现挑一些说下,有待改进处其他筒子请不吝指教。
关于最基本的和必要的oo建模,模块划分,html-js/css-js/event-js分离等就不多讲了,就是类似backbones的那种做法,先把数据、事件、控制、html视图等在组织上区分开,粒度根据需求去定。
我
1. 第一点就是json绑定优于模板渲染
传统上我们做一个crud,update的页面总是和create的页面多少有点不一样,这里的绑定的意思无非就是让样式、视图和数据更分离一点,这样做有个好处就是,不用在jsp/php/**template里面写类似下面的代码:
a)
<select>
{foreach item}
{if val = ***}
selected option append
b)
<input name="" value="<c:out value="${savedVo.myProperty}" />"
c)
<input if val eq ** checked />
尤其是存在一些关联菜单,需要和server动态交互的时候,要做这样的update页面,恐怕除了copy一个create页面外要写n多if/else了
其实可以采用下面做法,原语如下:
// 由数据对象绑定到表单控件集合
bind: function(data, pre, skipFieldLl, _formContext){
if(!data)
return;
pre = pre || 'f_';
for(key in data){
if(skipFieldLl && skipFieldLl.contains(key))
continue;
var val = data[key];
var _target = $("[name='" + pre + key + "']", _formContext);
if(_target.size() == 0)
continue;
// 下拉框如果不是特别说明需要绑定则跳过,因为大多数情况下拉框有联动的事件处理
if(_target[0].nodeName == 'SELECT'){
if(_target.hasClass('bind'))
_target.val(val);
else
continue;
}
// 特殊处理,如果是单选
if(_target.is(':radio')){
_target.filter(function(){
return $(this).val() == val;
}).attr('checked', 'checked');
// 如果是多选,val即是数组
}else if(_target.is(':checkbox')){
_target.filter(function(){
return val.contains($(this).val());
}).attr('checked', 'checked');
// 一般情况就直接赋值
}else{
_target.val(val);
}
}
},
关于关联菜单,可以先赋予第一个触发联动的那个select,然后再trigger('change')
然后被关联的在生成option时候,再判断是否是selected,如下:
// 先正常的去根据上级关联菜单去生成option
**.optionAppend(ll, _sel);
var targetVal = formData ? formData['saler_code'] : null;
_sel.val(targetVal);
2. 其次是通过约定把主要的数据关联关系确定,可以减少一些类似功能copy代码和dom标示
a) 比如对input[name$=_phone]的对象绑定一个特定的校验的事件;
b) 对input[name^=step1_ownerCode]在页面渲染后去执行val(getFormData('step1', 'ownerCode')),然后attr('disabled', true),表示要显示第一个步骤中录入的ownerCode字段,因为这里只是显示,所以还做做成readonly或disabled,如果ownerCode是一个select,而这里要显示的是option text里的业务有意义的字样,则可以看第三点的做法,一样使用;
c) 对一个tbody里的tr,该tr的td里是input/select,要保存这些数据,只需在tr里有一个有意义的标示就可以了,然后td里的控件值根据index下标去获取,然后再统一命名回来——这只是一个例子,适用的地方还很多,就是不需要大量的id/name等标示每一个或每一组控件,通过相对css选择器即可以达到目的,尤其是当这些控件是根据server端数据有规律动态渲染出来的情况。
3. 在保存表单数据键值对,可以同时保存一份业务字样的键值对
对于一个context(dom操作范围)里的html控件的数据保存,我们传统的做法是一个<form>wrap一下,然后$.param作为ajax的参数。其实我绝对如果只是一般的表单场景(非二进制数据流上传等),可以用一下原语更方面获取对象,然后以json形式传给server端再做数据绑定。
// 由表单控件集合转换成数据对象
params: function(_inputs, pre){
pre = pre || 'f_';
var data = {};
_inputs.each(function(){
// 如果是checkbox or radio
if($(this).is(':checkbox') || $(this).is(':radio')){
if(!$(this).is(':checked'))
return;
}
var val = $(this).val();
// 有可能是select没有option
if(val)
val = val.trim();
// 如果有空格则重新赋值
if(this.nodeName == 'INPUT' || this.nodeName == 'TEXTAREA'){
if(val != $(this).val())
$(this).val(val);
}
var key = $(this).attr('name').substring(pre.length);
// 如果是多选,以数组形式保存
if($(this).is(':checkbox')){
if(!data[key])
data[key] = [];
data[key].push(val);
}else{
data[key] = val;
}
});
return data;
},
其中pre只是命名的一个约定,比如在这个context中,我们只需要name^=f_开头的控件
其中一个是f_saler_code,另一个是f_saler_name,分别就表示业务员编号和姓名。
这里我们只是获取到了控件里的value=""的那部分值,如果完成这一步骤,我们想知道一个radio的value对应的业务字样(如性别M="男"),可以这么做:在动态生成或死代码写这个radio的html时候,我们尽量保持一样的格式,如
<input type="checkbox" value="1" /> A <input type="checkbox" value="2"/> B
这样我们可以在保存一个context控件键值对时候同时保存一份业务字样的副本,代码如下:
getExtData: function(formData){
for(key in formData){
var _target = $("[name='" +pre + key + "']");
if(_target.size() == 0)
continue;
if(_target[0].nodeName == 'SELECT'){
extData[key] = _target.find('option:selected').text();
}else if(_target.is(':radio') || _target.is(':checkbox')){
// 用正则去匹配吧
extData[key] = ***
// 原语如下:
if(_target.is(':radio')){
var index = _target.index(_target.filter(':checked'));
// checkbox/radio和其label都在一个tag里,一个parent
var txt = _target.parent().html().trim();
return ***.getLabelMatched(txt, index);
}else if(_target.is(':checkbox')){
var txt = _target.parent().html().trim();
var ll = [];
_target.each(function(index){
if($(this).is(':checked')){
var label = ***.getLabelMatched(txt, index);
if(label)
ll.push(label);
}
});
if(ll.length > 0)
return ll.join(',');
}
}
}
}
分享到:
相关推荐
表单解析器将用户设计的表单转换为可执行的代码或数据结构,数据绑定器则负责将表单数据与后端数据库进行同步。 8. **POM.xml** 这是Maven项目的配置文件,用于管理项目的依赖、构建设置等。在动态表单项目中,它...
在InfoPath Form Services中,开发者可以创建高级的表单,这些表单不仅包含静态字段,还可能有复杂的业务逻辑和数据验证规则。当用户填写并提交这些表单时,通常需要将数据保存到后端存储,如SharePoint列表。这就是...
- **Create(创建)**:用户在表单中填写新数据,点击“保存”按钮,表单数据通过Form的submit方法发送到服务器,服务器处理后返回成功或失败信息。 - **Read(读取)**:Grid组件通过Store的load方法从服务器获取...
1. **表单的概念**:在VFP中,表单(Form)是用来组织和展示数据的窗口,用户可以通过表单与数据库进行交互。它可以包含各种控件,如文本框、按钮、列表框等,使得数据的输入、查看和编辑更加直观。 2. **创建表单*...
在自定义表单系统中,模型存储表单数据,视图负责显示,而控制器处理用户交互并更新模型和视图。 5. **持久化存储**:收集到的数据通常需要保存到数据库或文件系统中,这就需要数据库操作的知识,如JDBC(Java ...
标题 "dojostateful 实现表单数据绑定" 涉及到的是Dojo Toolkit中的一个关键特性,即Stateful模式,它在处理用户界面(UI)和数据模型之间的交互时起到重要作用。Dojo Stateful对象是Dojo框架提供的一种状态管理工具...
比如,监听表单的submit事件,进行数据校验后发送Ajax请求,实现数据的保存。 7. **拖拽布局**:为了实现拖拽设计,可以引入第三方库如Vue.Draggable,它可以与Vue的组件系统很好地整合,让用户可以通过拖放操作...
动态表单设计是指在运行时根据业务需求生成和修改表单的机制。在Java中,这通常涉及到后端服务器处理动态生成HTML、CSS和JavaScript代码,然后通过HTTP响应发送给前端浏览器。Spring MVC或Struts等Web框架提供了...
2. **动态表单**:支持根据后端数据动态生成表单,允许添加、删除和修改表单字段,使得表单构建更加灵活。 3. **验证规则**:内置各种验证规则,如非空、邮箱格式、电话号码格式等,可以轻松添加自定义验证逻辑。 ...
在这个名为"ssh2的表单数据添加存储展示"的项目中,我们将深入探讨SSH2框架如何处理多表单数据,并集成MySQL数据库进行存储和展示。 首先,Struts2作为MVC框架,负责处理用户的请求和展示视图。在处理多表单数据时...
动态表单是一种根据业务需求能够动态生成和修改的表单,常见于Web应用中,尤其在数据录入、信息收集和用户交互场景下。本项目是一个简单的动态表单实现,覆盖了从设计表单到入库保存,再到表单的填写与展示的完整...
7. **自定义事件和交互**:泛微表单JS大全可能还包括一些自定义事件处理,如表单提交前的验证、表单数据的动态加载或保存等,通过JS实现更为复杂的用户交互。 8. **错误提示和反馈**:JS可以实时向用户提供错误提示...
4. **事件处理**:表单设计器还允许添加和编辑事件处理器,比如在用户交互时触发的函数,如点击、改变或验证事件。 5. **模板与主题**:支持自定义表单样式和主题,可以保存为模板供未来重复使用。 6. **数据绑定*...
在CRM系统中,JSON文件可能被用来保存用户的自定义表单设置、字段映射或者系统配置,方便数据的读取和更新。 “scripts”文件夹可能包含了系统运行所需的脚本,如JavaScript脚本,它们负责实现页面交互、动态数据...
这个框架特别强调用户界面的高效性和响应性,为开发者提供了便捷的方式来实现复杂的业务逻辑。在这个“unigui_网页iframe交互_完善_03”的主题中,我们将深入探讨Unigui如何与网页中的IFrame元素进行交互,并实现...
3. **动态数据绑定**:与Vue.js的数据驱动理念相结合,表单中的每个组件都可以绑定到特定的数据模型,使得表单数据的管理和验证变得简单。 4. **自定义组件**:除了Element UI提供的基础组件外,工具可能还支持...
- `save.aspx`:可能处理用户提交的表单数据,执行验证并保存到后台数据库。 - `data.aspx`:可能涉及数据的检索、编辑或删除功能。 - `web.config`:配置文件,包含ASP.NET应用程序的设置,如连接字符串、身份...
动态表单的创建是现代Web应用中的一个重要需求,它允许用户或管理员根据业务需要灵活地增减表结构,提高系统的可扩展性和适应性。 首先,我们需要了解SpringMVC的核心组件。Controller负责处理HTTP请求,Model用于...
在IT领域,尤其是在Web开发中,"带验证的分步式注册表单"是一个常见的功能设计,它旨在提高用户体验和数据质量。分步式表单将一个复杂的注册过程拆分成多个简单的步骤,使得用户能够逐步填写信息,每一步只关注少量...
其一,集团下属的外部单位可以调用、创建或更新本单位的表单数据;其二,本单位的外部应用程序也能执行相同操作。值得注意的是,为了保证流程的简洁高效,推荐使用无流程的表单来构建业务接口,尽管也可以创建流程...