Help us shape the 2021 DevExtreme Roadmap. Take our 5 minute survey.
Your search did not match any results.

SignalR Service


This demo shows how two users can edit data in the Scheduler simultaneously. A SignalR service is used to broadcast push notifications.

Each Scheduler has an individual store to emulate the situation when Schedulers are being edited on two different clients. Changes made in one Scheduler are repeated in the other and persist until the browser session has expired.

Copy to CodePen
$(function() { var BASE_PATH = ""; var url = BASE_PATH + "api/SchedulerSignalR"; var createScheduler = function(index) { $("#scheduler" + index).dxScheduler({ timeZone: "America/Los_Angeles", dataSource:{ key: "AppointmentId", loadUrl: url, insertUrl: url, updateUrl: url, deleteUrl: url, onBeforeSend: function(method, ajaxOptions) { ajaxOptions.xhrFields = { withCredentials: true }; } }), remoteFiltering: true, views: ["day", "workWeek"], currentView: "day", currentDate: new Date(2021, 4, 25), startDayHour: 9, endDayHour: 19, height: 600, dateSerializationFormat: "yyyy-MM-ddTHH:mm:ssZ", textExpr: "Text", descriptionExpr: "Description", startDateExpr: "StartDate", endDateExpr: "EndDate", allDayExpr: "AllDay" }); }; createScheduler(1); createScheduler(2); var store1 = $("#scheduler1").dxScheduler("getDataSource").store(); var store2 = $("#scheduler2").dxScheduler("getDataSource").store(); var connection = new signalR.HubConnectionBuilder() .withUrl(BASE_PATH + "schedulerSignalRHub", { skipNegotiation: true, transport: signalR.HttpTransportType.WebSockets }) .configureLogging(signalR.LogLevel.Information) .build(); connection.start() .then(function () { connection.on("update", function (key, data) { store1.push([{ type: "update", key: key, data: data }]); store2.push([{ type: "update", key: key, data: data }]); }); connection.on("insert", function (data) { store1.push([{ type: "insert", data: data }]); store2.push([{ type: "insert", data: data }]); }); connection.on("remove", function (key) { store1.push([{ type: "remove", key: key }]); store2.push([{ type: "remove", key: key }]); }); }); });
<!DOCTYPE html> <html xmlns=""> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <script src=""></script> <script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script> <script src="../signalr-session-id.js"></script> <script src="js/signalr.js"></script> <link rel="stylesheet" type="text/css" href="" /> <link rel="stylesheet" type="text/css" href="" /> <script src=""></script> <script src=""></script> <script src="index.js"></script> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div class="schedulers"> <div class="column-1"> <div id="scheduler1"></div> </div> <div class="column-2"> <div id="scheduler2"></div> </div> </div> </div> </body> </html>
.schedulers { display: flex; } .column-1 { padding-right: 5px; } .column-2 { padding-left: 5px; } .dx-scheduler-small .dx-scheduler-view-switcher.dx-tabs { display: table; }