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 ...
随机推荐
- mac pycharm快捷键
Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭头 ...
- analysed of J-SON/XML processing model Extend to java design model (J-SON/XML处理模型分析 扩展到Java设计模型 )
一.JSON和XML 1.JSON JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.可在不同平台之间进行数据交换.JSON ...
- ARDUINO入门按键通信试验
1.1按键实验 1.需要学习的知识: 1) Arduino 的输入口配置方法,配置函数的用法 通过pinMode()函数,可以将ADUINO的引脚配置(INPUT)输入模式 2) 搞懂什么是抖动 机械 ...
- orm 扩展
"""ORM小练习 如何在一个Python脚本或文件中 加载Django项目的配置和变量信息""" import os if __name_ ...
- 史上最全!Selenium元素定位的30种方式
Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素才能进行后续的自动化控制,我在这里将对各种元素定位方式进行总结归纳一下. 这里将统一使用百度 ...
- 优雅的使用Linux
优雅的使用Linux 系统安装 启动盘制作 通过rufus烧制官网镜像,注意根据自己系统的引导模式选择相应模式,不确定的,可以在windows中通过Win + R 快捷键调出"运行" ...
- 信息安全之路-web-xss学习(2)
存储型xss漏洞 该漏洞会将执行命令写入数据库,每一个用户在该页面停留时,都会被动执行该js命令,从而被盗取cookie 1.DVWA平台验证-low等级 <?php if( isset( $_ ...
- Python装饰器的另类用法
之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
系统环境: win10家庭版 dell本 问题描述:蓝牙设备(比如蓝牙键盘,蓝牙音箱)出现无法连接的情况,打算删除已配对的设备,再重新配对连接.但删除设备后重启蓝牙,那些原本被删除的设备又自动配对上, ...
- springmvc学习之jdk版本,tomcat版本,spring版本
使用的软件是myeclipse2018,jdk8,tomcat9.0,spring3.2.0 以上为我的软件及各种配置 1.建立了web工程,build path 使用的是默认的j2EE1.8(只有配 ...