Какой наименее костыльный способ использовать автообновление данных через webSockets существует в webix? Faye не предлагать, т.к. у меня бэкэнд на golang.
Можно сделать свой прокси.
Если посмотреть код интеграции с Faye - он тоже оформлен как прокси. Можно по анлогии сделать свое решение на нативных ВебСокетах
webix.proxy.faye = {
$proxy:true,
init:function(){
this.clientId = this.clientId || webix.uid();
},
load:function(view){
var selfid = this.clientId;
this.client.subscribe(this.source, function(update){
if (update.clientId == selfid) return;
webix.dp(view).ignore(function(){
if (update.operation == "delete")
view.remove(update.data.id);
else if (update.operation == "insert")
view.add(update.data);
else if (update.operation == "update"){
var item = view.getItem(update.data.id);
if (item){
webix.extend(item, update.data, true);
view.refresh(item.id);
}
}
});
});
},
save:function(view, update, dp, callback){
update.clientId = this.clientId;
this.client.publish(this.source, update);
}
};
И кстати, есть
Сразу предупреждаю - я не web программист;
Faye - первый раз слышу: почитаю как время будет.
Есть рабочее "WebDesctop"ное приложение (webUI - мозги C#) - ВСЁ на стороне сервера - который принимает и отправляет JSON немедленно (один клиент - один поток)
полностью свой код вместо всяких Apach’ей (и http, и websocket)
пытаюсь адаптировать UI на Webix (сражу скажу для меня Webix = ПАНАЦЕЯ … молорики!!!)
методы как element[name].apply(element, param{});
события как element.attachEvent(name, function (a1,a2) {.sendAsJSON({a1,a2}).};
…
insert как webix.ui(data);
update как element.define(data);
…
вроде все хорошо, но… какая то сыроватость есть…
всё надо к единому знаменателю приводить
ИМХО
!!!) придумайте JSON парсер - чтобы функции можно было парсить из JSON строки (например
{“id”:“asd”,“func”:$function(e){}$}
=
{id:“asd”,func=function(e){}}
вместо доллара какой нибудь спецсимвол…)
-
аргументы у событий надо в eventArg объект запаковать чтобы по JSON отправлять можно было (а то у каждого события 1 или более аргументов разноформатных - надо костыли лепить)
-
в таблице разрешить добавлять события к edit’ам
-
данные обновлять через define({id:“1”,data[{id:“1.1”}]})
-
слышал у браузеров появилась возможность работать с SQL - реализуйте интерфейс…
-
сделайте Webix плагин к jQuery - чтоб работать с webix через него типа $("%asd").rows([{id:“asd”}])
-
с документацией трудно работать, на английском, да и не совсем полная, о многих функциях случайно узнаешь когда не так работают как думаешь.
…
PS нифига я настрочил, и это только навскидку
PPS идей много, можно блог открывать ))) да времени нет, по почте могу изливать, или на форуме флудить.
PPPS че сказать то хотел - можно какойнить маленький демо на основе выше указанного кода для websocket’a - а то не могу понять логику, что присылать, что забирать, и как быть с функциями.
Любое решение всегда можно подогнать под себя. В том числе создать парсер или кастомный метод обновления данных.
(2) Для таблицы существует пять таких событий. Они есть в списке в API.
(4) Работа с классическим SQL-сервером описана, например, здесь и здесь. Также реализован интерфейс для работы с IndexedDB, по аналогии можно создать интерфейс и для других браузерных БД.
(5) Интеграция с jQuery уже существует.
А приведённый выше код взят напрямую из библиотеки и касается статьи, в конце ктоторой есть ссылка на нужное Вам демо.
Это всего лишь мое скромное мнение.
Вы итак проделали огромную работу.
Я высказываю то что мне не хвататет или на мой взгляд улучшило бы ваш продукт.
[2] не событие к таблице в котором через switch case обрабатывать событие а на прямую к ячейке.
[4]HTML 5. Работа с Web SQL базой данных / Habr
[5]я имел ввиду чтобы работать не через jQuery а как с jQuery. Один доллар в начале, дальше через точку методы.
извините, что вклиниваюсь в ваше обсуждение
(5) Интеграция с jQuery уже существует.
речь идёт о том, чтобы можно было в стиле jQuery обращаться к элементам таблицы (ну, например, покажите, как можно через jQuery для определённой ячейки таблицы задать свойство, например, сменить CSS)
или назначать обработчики в стиле
$(‘селектор’).on(‘dblclick’…
а не в стиле:
dtable.attachEvent(‘onItemDblClick’,
или вызывать методы $(селектор).МетодWebix()
p.s. сразу, заранее, прошу меня извинить, если я пургу несу, знания JS/jQuery у меня небольшие…
Sergebl, (5) вы уловили суть моего вопроса.
День добрый
аргументы у событий надо в eventArg объект запаковать
eventArg это паттерн из типизированных языков программирования, в javascript в этом нет особого смысла. Если очень надо то внутри любого события можно использовать arguments
который и будет примитивным eventArg объектом.
в таблице разрешить добавлять события к edit’ам
не сделано сознательно, дабы избежать проблем с производительностью
и текущее решение не означает что надо использовать гигантский switch-case, у одного события может быть много обработчиков, то есть можно на одно и тоже onBeforeEditStart навесить 20 разных обработчиков, для разных ячеек
- данные обновлять через define({id:“1”,data[{id:“1.1”}]})
define обновляет конфигурацию
для данных есть .parse и .updateItem апи
- слышал у браузеров появилась возможность работать с SQL - реализуйте интерфейс…
Это мертвый стандарт, часть браузеров отказалась его поддерживать, так что будущего у него нет.
речь идёт о том, чтобы можно было в стиле jQuery обращаться к элементам таблицы
а какого рода селекторы были бы полезны в таком апи? какие операторы над ячейками?
Мы точно не будем вносить это в основную библиотеку, но я не вижу проблем сделать такую систему поверх уже существующего API
аргументы у событий надо в eventArg объект запаковать
element.attachEvent(item.name, function (e) {
webSocketSend(stringify(e));
// универсальный метод на все случаи жизни
// нет необходимости конвертировать arguments от каждого
// конкретного события, тем более что не все запаковывается в stringify
})
в таблице разрешить добавлять события к edit’ам
datatable.attachEvent(‘edit’, function (index,value,container) {
if(index==??){
var view = webix.ui( { view:“counter”, value:value, container:container});
// аля свобода
}
})
данные обновлять через define({id:“1”,data[{id:“1.1”}]})
а какого рода селекторы были бы полезны в таком апи? какие операторы над ячейками?
.data(id):object - возвращает итем
.data(id,name):value - возвращает значение
.data(id, name, value) - задает значение
.data(id,{name1:value1,name2:value2}) - задает группу значений
.data(id, function(name, value)): -
Функция вызывается отдельно, для каждого из выбранных элементов. При вызове, ей передаются следующие параметры:
name — позиция элемента в наборе,
value — текущее значение
на вскидку (по следам .css())