Чтобы обеспечить обновления приложений в реальном времени (например, в чатах), используйте WebSockets.
Изначальные данные загружаются в компонент без сокета. Сокеты необходимы только для обновлений данных:
const socket = new WebSocket("ws:host");
Чтобы отправить данные на сервер, используйте событие onStoreUpdated и метод socket.send():
$$("data").data.attachEvent("onStoreUpdated", (id, update, operation) => {
socket.send(webix.stringify(update));
});
Чтобы обновить данные на клиенте, используйте socket.onmessage(). Однако помните, что вам необходимо обернуть обновления данных в DataProcessor.ignore(), во избежании ненужных сохранений на сервер.
socket.onmessage = (e) => {
var update = webix.DataDriver.json.toObject(e.data);
webix.dp(view).ignore(() => {
// обновления данных компонента
// ...
});
};
Это полное решение, т.к. пользовательский прокси, который открывает сокет, сам позаботится о получении обновлённых данных и закроет соединение, когда оно более не понадобится:
//declare
webix.proxy.socket = {
$proxy:true,
load:function(view) {
// создаём сокет соединение
this.socket = new WebSocket("ws:"+this.source);
// обрабатываем ошибки
this.socket.onerror = (error) => {
console.log("WebSocket Error", error);
};
// получаем обновления
this.socket.onmessage = (e) => {
// обновляем данные
// ...
};
// закрываем соединение при разрушении компонента
view.attachEvent("onDestruct", () => {
this.socket.close();
});
},
save:function(view, update) {
// отправляем сообщение на сервер
this.socket.send(webix.stringify(update));
}
};
Теперь вы можете описать прокси и использовать его для обновлений данных в компоненте в реальном времени:
// создаём обычный прокси для загрузки и сохранения с уникальным ключом и clientId
var data_proxy = webix.proxy("socket", "//localhost:8080", {
key:"data", clientId:webix.uid()
});
// используем прокси
webix.ui({
view:"datatable",
url:data_proxy,
save:data_proxy
});
Это базовые инструкции по реализации обновлений в реальном времени с использованием WebSockets. Более подробную информацию читайте в статье нашего блога.
По ссылке ниже вы найдёте live-демо. Также вы можете открыть это демо в пакете (чтобы загрузить демо, выполните команду node backend/index.js
).