Здравствуйте.
Хочу предложить простой, но эффективный метод передачи данных для различных webix компонентов. Данные передаются как массив массивов элементов и данные о названии полей и их типах.
Преимущества:
- Уменьшение объема передаваемых данных и соответственно времени
которое ожидает пользователь; - Управлении типами - можно задать тип каждого элемента, что намного упрощает дальнейшую работу внутри компонентов;
- Передача имен параметров с сервера, а не произвольных как jsarray (data1 … dataN);
- Для компонент webix которые изначально были сделаны для работы с json ничего не меняется (не надо писать схемы, делать map`ы)
Примерная экономия на больших наборах данных - более 2х раз по сравнению с передачей данных чисто в json формате;
Метод может быть полезен при передачи больших объемов информации, например статистика, данные для графиков или аналитического куба.
Данный драйвер ожидает на входе json вида:
{ data: [
["1","Apple"],
["2","Fish"],
...
],
meta: [
{name:"id", type:"int"},
"value"
]
}
где:
data: это массив в каждом элементе - массив со значениями
meta: массив описания данных, в каждом элементе либо строка с именем, либо объект с двумя свойствами name и type.
type может быть: str, int, date, float, unixtime
Преобразуется во что то типа:
[
{id:1,value:"Apple"},
{id:2,value:"Fish"},
...
]
Как использовать:
https://snippet.webix.com/5dj00exo
Код:
webix.DataDriver.metajsArray = webix.extend({
getRecords:function(data){
let meta;
if (data && data.meta)
meta = data.meta;
if (data && data.data)
data = data.data;
if (meta && Array.isArray(meta) && Array.isArray(data) ){
// transform data array of array to array of object
data.forEach(function(item, index, array) {
let i;
let res = {};
let mtype;
for (i = 0; i < this.length; i++) {
let m = this[i]
if (typeof m == "string")
res[m] = item[i]
else if (typeof m == "object" && m.name){
if (m.hasOwnProperty('type'))
mtype=m.type.toLowerCase();
else
mtype = 'str';
if (mtype == 'int')
res[m.name] = parseInt(item[i]);
else if (mtype == 'float')
res[m.name] = parseFloat(item[i]);
else if (mtype == 'date')
res[m.name] = new Date(item[i].replace("T", " "));
else if (mtype == 'unixtime')
res[m.name] = new Date(parseInt(item[i]) * 1000);
else
res[m.name] = item[i];
}
}
array[index] = res;
},meta);
}
return data;
},
}, webix.DataDriver.json);
Все кому понравится - пользуйтесь без ограничений. Если включите в состав webix я только порадуюсь)