Your search did not match any results.
Scheduler

Virtual Scrolling

With virtual scrolling, you can improve the overall performance of your application and reduce load times when our Scheduler widget is bound to a large data set. When virtual scrolling is enabled, our Scheduler widget only renders visible appointments. When an appointment leaves the viewport, the Scheduler removes it from the DOM. The data set in this demo contains 100 groups with 9 appointments each.

To enable virtual scrolling mode, set the scrolling.mode option to "virtual".

Virtual scrolling support is available in the following Scheduler views: "day", "week", and "workWeek".

Copy to CodeSandBox
Apply
Reset
<dx-scheduler [dataSource]="appointments" [height]="600" [views]="[{ type: 'day', groupOrientation: 'vertical', name: '2 Days', intervalCount: 2 }, { type: 'day', groupOrientation: 'vertical', name: '3 Days', intervalCount: 3 }, { type: 'workWeek', name: 'Work Week', groupOrientation: 'vertical' }]" currentView="3 Days" [currentDate]="currentDate" [startDayHour]="9" [endDayHour]="18" [scrolling]="{ mode: 'virtual' }" [showAllDayPanel]="false" [groups]="['resourceId']" [resources]="[{ fieldExpr: 'resourceId', dataSource: resources }]" > </dx-scheduler>
import { NgModule, Component, enableProdMode } from '@angular/core'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; import {Resource, Appointment, Service} from './app.service'; import {DxSchedulerModule} from 'devextreme-angular'; if(!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ styleUrls: ['app/app.component.css'], selector: 'demo-app', templateUrl: 'app/app.component.html', providers: [Service] }) export class AppComponent { resources: Resource[]; appointments: Appointment[]; currentDate: Date = new Date(2021, 8, 6); constructor(service: Service) { this.resources = service.generateResources(); this.appointments = service.generateAppointments(); } } @NgModule({ imports: [ BrowserModule, DxSchedulerModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule)
import { Injectable } from "@angular/core"; export class Appointment { text: string; startDate: Date; endDate: Date; allDay?: boolean; resourceId?: number; } export class Resource { id: number; text: string; color: string; } const dataSet: Appointment[] = [{ text: "Website Re-Design Plan", startDate: new Date(2021, 8, 6, 9, 30), endDate: new Date(2021, 8, 6, 11, 30) }, { text: "Book Flights to San Fran for Sales Trip", startDate: new Date(2021, 8, 6, 12, 0), endDate: new Date(2021, 8, 6, 13, 0), allDay: true }, { text: "Install New Router in Dev Room", startDate: new Date(2021, 8, 6, 14, 30), endDate: new Date(2021, 8, 6, 15, 30) }, { text: "Approve Personal Computer Upgrade Plan", startDate: new Date(2021, 8, 7, 10, 0), endDate: new Date(2021, 8, 7, 11, 0) }, { text: "Final Budget Review", startDate: new Date(2021, 8, 7, 12, 0), endDate: new Date(2021, 8, 7, 13, 35) }, { text: "New Brochures", startDate: new Date(2021, 8, 7, 14, 30), endDate: new Date(2021, 8, 7, 15, 45) }, { text: "Install New Database", startDate: new Date(2021, 8, 8, 9, 45), endDate: new Date(2021, 8, 8, 11, 15) }, { text: "Approve New Online Marketing Strategy", startDate: new Date(2021, 8, 8, 12, 0), endDate: new Date(2021, 8, 8, 14, 0) }, { text: "Upgrade Personal Computers", startDate: new Date(2021, 8, 8, 15, 15), endDate: new Date(2021, 8, 8, 16, 30) }, { text: "Customer Workshop", startDate: new Date(2021, 8, 9, 11, 0), endDate: new Date(2021, 8, 9, 12, 0), allDay: true }, { text: "Prepare 2015 Marketing Plan", startDate: new Date(2021, 8, 9, 11, 0), endDate: new Date(2021, 8, 9, 13, 30) }, { text: "Brochure Design Review", startDate: new Date(2021, 8, 9, 14, 0), endDate: new Date(2021, 8, 9, 15, 30) }, { text: "Create Icons for Website", startDate: new Date(2021, 8, 10, 10, 0), endDate: new Date(2021, 8, 10, 11, 30) }, { text: "Upgrade Server Hardware", startDate: new Date(2021, 8, 10, 14, 30), endDate: new Date(2021, 8, 10, 16, 0) }, { text: "Submit New Website Design", startDate: new Date(2021, 8, 10, 16, 30), endDate: new Date(2021, 8, 10, 18, 0) }, { text: "Launch New Website", startDate: new Date(2021, 8, 10, 12, 20), endDate: new Date(2021, 8, 10, 14, 0) } ]; const colors = [ 'rgba(88, 116, 255, 0.8)', 'rgba(234, 128, 252, 0.8)', 'rgba(198, 86, 144, 0.85)', 'rgba(254, 194, 0, 0.7)' ]; @Injectable() export class Service { get resourcesAmount() { return 100; } generateResources(): Resource[] { const resources = []; for(let i = 0; i < this.resourcesAmount; ++i) { const color = colors[i % colors.length]; resources.push({ id: i, text: `Resource ${i}`, color: color }); } return resources; }; generateAppointments(): Appointment[] { const data = []; for(let resourceId = 0; resourceId < this.resourcesAmount; ++resourceId) { dataSet.forEach(item => { data.push({ text: item.text, startDate: item.startDate, endDate: item.endDate, resourceId }); }); } return data; } }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ System.config({ transpiler: 'ts', typescriptOptions: { module: "system", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" }, 'devextreme/localization.js': { "esModule": true } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.5.3/lib/typescript.js', '@angular': 'npm:@angular', 'tslib': 'npm:tslib@2.0.3/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.25.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@20.2.4', 'jszip': 'npm:jszip@3.5.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@0.9.7/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.0.5', 'devexpress-gantt': 'npm:devexpress-gantt@2.0.8', 'devextreme-angular': 'npm:devextreme-angular@20.2.4', 'preact': 'npm:preact@10.5.7/dist/preact.js', 'preact/hooks': 'npm:preact@10.5.7/hooks/dist/hooks.js' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, packageConfigPaths: [ "npm:@angular/*/package.json", "npm:@angular/common/*/package.json", "npm:rxjs/package.json", "npm:rxjs/operators/package.json", "npm:devextreme-angular/*/package.json", "npm:devextreme-angular/ui/*/package.json", "npm:devextreme-angular/package.json", "npm:devexpress-diagram/package.json", "npm:devexpress-gantt/package.json", ] });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.2.4/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.10.2/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>