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
var DemoApp = angular.module('DemoApp', ['dx']); var BASE_PATH = ""; DemoApp.controller('DemoController', function DemoController($scope) { var store1 = createStore(), store2 = createStore(); $scope.scheduler1Options = createOptions(store1); $scope.scheduler2Options = createOptions(store2); 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 }]); }); }); }); var createStore = function() { var url = BASE_PATH + "api/SchedulerSignalR"; return{ key: "AppointmentId", loadUrl: url, insertUrl: url, updateUrl: url, deleteUrl: url, onBeforeSend: function(method, ajaxOptions) { ajaxOptions.xhrFields = { withCredentials: true }; } }) }; var createOptions = function(store) { return { dataSource: store, timeZone: "America/Los_Angeles", 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" }; };
<!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> <link rel="stylesheet" type="text/css" href="" /> <link rel="stylesheet" type="text/css" href="" /> <script src=""></script> <script>window.angular || document.write(decodeURIComponent('%3Cscript src="js/angular.min.js"%3E%3C/script%3E'))</script> <script src=""></script> <script src=""></script> <script src="js/signalr.js"></script> <script src="../signalr-session-id.js"></script> <script src="index.js"></script> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body class="dx-viewport"> <div class="demo-container" ng-app="DemoApp" ng-controller="DemoController"> <div class="schedulers"> <div class="column-1"> <div dx-scheduler="scheduler1Options" id="scheduler1"></div> </div> <div class="column-2"> <div dx-scheduler="scheduler2Options" 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; }