webix的Form绑定支持数组Array
绑定的原理
form.setValues:把树形对象,压平展开成一维的。比如:
var data = {
id: 11,
name: {
first: 'alex',
last: 'wu'
}
};
var dataCollapsed = {
id: 11,
name.first: 'alex',
name.last: 'wu'
};
压平之后,再根据key去赋值。
同理,form.getValues:是逆过程,把一维的数组合成树形结构。
核心代码是webix.CodeParser.collapseNames/expandNames,一看就明白。压平展开collapseNames是个很好的递归的例子;合成树形expandNames则是双层循环。
支持数组Array绑定
但webix的实现里不支持数组,WPF是支持的、Vue.js也支持。而且实际的场景里,有时确实需要将数组压平展示,datatable之类的列表虽然强大,但看多了有点傻。改了下webix的源码,如下:
webix.CodeParser = {
//converts a complex object into an object with primitives properties
collapseNames:function(base, prefix, data){
data = data || {};
prefix = prefix || "";
if(!base || typeof base != "object")
return null;
for(var prop in base){
if(base[prop] && typeof base[prop] == "object" && !webix.isDate(base[prop]) && !webix.isArray(base[prop])){
webix.CodeParser.collapseNames(base[prop], prefix+prop+".", data);
} else if(base[prop] && typeof base[prop] == "object" && webix.isArray(base[prop])){
for(var i=0;i<base[prop].length;i++){
webix.CodeParser.collapseNames(base[prop][i], prefix+prop+"["+i+"].", data);
}
} else {
data[prefix+prop] = base[prop];
}
}
return data;
},
//converts an object with primitive properties into an object with complex properties
expandNames:function(base){
var data = {},
regex = /(\w+)\[(\d+)\]/,
i, lastIndex, names, name, obj, prop;
for(prop in base){
names = prop.split(".");
lastIndex = names.length-1;
obj = data;
for( i =0; i < lastIndex; i++ ){
name = names[i];
var match = regex.exec(name);
if(match){
if(!obj[match[1]]){
obj[match[1]] = [];
}
while(obj[match[1]].length < 1+parseInt(match[2])){
obj[match[1]].push({});
}
}else if(!obj[name]){
obj[name] = {};
}
obj = match? obj[match[1]][match[2]] : obj[name];
}
obj[names[lastIndex]] = base[prop];
}
return data;
}
};
修改之后的问题是,不支持原来的树形绑定,可以通过既压平展开、又保留原来的列表属性来兼容2种绑定方式。
webix的Form绑定支持数组Array的更多相关文章
- vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决
vue 不支持 数组Array,只支持get set push,但是正是做tab的时候,用到splice,就都不好用了,最后用v-if,从新渲染 完美解决
- 终于解决了IE8不支持数组的indexOf方法,array的IndexOf方法
/* 终于解决了IE8不支持数组的indexOf方法 */ if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (el ...
- JavaScript (JS)基础:DOM 浅析 (含数组Array、字符串String基本方法解析)
①文本对象document: 例如:document.getElementById() 只获取一个对象 document.getElementsByTagName() 获取 ...
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别
ArrayList和Vector的区别ArrayList与Vector主要从二方面来说. 一.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...
- paip.提升效率---提升绑定层次--form绑定取代field绑定
paip.提升效率---提升绑定层次--form绑定取代field绑定 =================== 编辑form中,常常需要,绑定一个对象到个form.. 传统上要绑定field开始. ...
- 如何判断一个变量是数组Array类型
在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...
- javascript对象深拷贝,浅拷贝 ,支持数组
javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...
- 数组Array和列表集合ArrayList、LinkedList和Vector的区别
一.ArrayList和Vector的区别 ArrayList与Vector主要从以下方面来说. 1.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同 ...
- (66)Wangdao.com第十一天_JavaScript 数组Array
数组 Array 本质上,数组属于一种特殊的对象.typeof 运算符会返回数组的类型是 object 数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2...) // Object.ke ...
随机推荐
- 编程类-----matlab基础语法复习(1)
2019年美赛随笔记录: 具体功能:基础语法+基本运算+画图+矩阵+excel读取....... 所遇问题及其解决方案: 1. que:matlab中plot画图无法复制下来图片? ...
- ipv4网络无访问权限
昨天折腾了一天这个网络受限问题,都没有得到解决,驱动精灵.电脑管家(我不用360).重置Winsock目录.网络重置.组策略控制台.重启路由器(学校的以太网,工作时间不好重置路由器)都用了个遍,一直都 ...
- 不错的anroid源码在线浏览网站【学习笔记】
不错的anroid源码在线浏览网站:http://androidxref.com/
- 剑指offer 15:反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头. 法一:迭代法 /* public class ListNode { int val; ListNode next = null; ListNod ...
- golang Mysql -- Tx
Transaction 事务 事务处理是数据的重要特性.尤其是对于一些支付系统,事务保证性对业务逻辑会有重要影响.golang的mysql驱动也封装好了事务相关的操作.我们已经学习了db的Query和 ...
- ArrayList源码阅读笔记(1.8)
目录 ArrayList类的注解阅读 ArrayList类的定义 属性的定义 ArrayList构造器 核心方法 普通方法 迭代器(iterator&ListIterator)实现 最后声明 ...
- .NET、C#和ASP.NET、ASP.NET MVC四者之间的区别
什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.NET Framwork(.NET框架)是.NET程序开发和运行的环境,在这个平台下可以用不同的语言进行开发,因为.NET是跨语 ...
- HTML和CSS查缺补漏
margin的问题: 1.margin-top向上传递 解决:1.父元素border边框,2.父元素使用overflow:hidden 3.为父元素或者子元素声明绝对定位,4.为父元素或者子元素声明浮 ...
- 什么是卷积convolution
定义 卷积是两个变量在某范围内相乘后求和的结果.如果卷积的变量是序列x(n)和h(n),则卷积的结果 , 其中星号*表示卷积. 当时序n=0时,序列h(-i)是h(i)的时序i取反的结果:时序取反使得 ...
- Confluence 6 针对 'unmigrated-wiki-markup' 宏重新尝试合并
在签名的章节中,我们主要是针对没有完全合并完成余下的为合并内容的异常处理.最常见的情况是内容以及被合并了,但是页面使用 wiki 标记的内容没有被合并,通常这些 wiki 标记的内容使用了 'unmi ...