syncfusion-javascript-data-manager
DataManager for TypeScript/JavaScript - Complete Guide
Table of Contents
⚠️ Security & Trust Boundary
- This skill generates code only, the agent does not execute data operations or fetch remote endpoints — all DataManager interactions occur solely within the user's application at runtime.
- Generated code must treat all third-party API responses as untrusted input, never bind to unvalidated or user-provided URLs, and ensure authentication is enforced on all remote endpoints.
Key Concepts
10 Adaptor Types (Decision Guide)
| Scenario | Adaptor | When to Use |
|---|---|---|
| Local arrays | JsonAdaptor | In-memory JavaScript arrays, no server needed |
| ASP.NET Web API | WebApiAdaptor | ASP.NET backend returning Items/Count format |
| Generic REST | UrlAdaptor | Standard REST APIs with result/count format |
| Client + Server | RemoteSaveAdaptor | Client-side filtering, server-side CRUD |
| OData v3 | ODataAdaptor | Legacy OData v3 services |
| OData v4 | ODataV4Adaptor | Modern OData v4 with expand relations |
| Legacy ASP.NET | WebMethodAdaptor | ASMX web methods (deprecated) |
| GraphQL | GraphQLAdaptor | GraphQL endpoints |
| Custom Format | Custom DataAdaptor | Non-standard API response formats |
| Full Control | CustomAdaptor | Complete adaptor override |
Data Binding Types
Local Binding
├─ Direct array: new DataManager({ json: data })
├─ JsonAdaptor explicit
└─ Client-side filtering instant
Remote Binding
├─ WebApiAdaptor: ASP.NET specific
├─ UrlAdaptor: Generic REST
├─ ODataAdaptor/V4: Protocol-based
└─ Server processes Query object
Query Operations
// Filter/Search
.where('field', 'operator', value) // Single condition
.where(predicate) // Complex predicate
// Sort/Order
.sortBy('field') // Ascending
.sortByDescending('field') // Descending
.orderBy('field') // Alias
// Pagination
.take(10) // Limit records
.skip(0) // Offset
// Projection
.select(['field1', 'field2']) // Column selection
// Relationships
.expand('relatedTable') // OData expand
// Grouping & Aggregation
.group('field') // Group by
.aggregate('sum', 'field') // Calculate
10 Adaptors Reference
Decision Tree: Which Adaptor?
Does your data come from?
│
├─ JavaScript array in memory?
│ └─ JsonAdaptor
│
├─ Web Server / REST API?
│ ├─ ASP.NET Web API (backend specific)?
│ │ └─ WebApiAdaptor (Items/Count format)
│ ├─ Generic REST endpoint?
│ │ └─ UrlAdaptor (result/count format)
│ ├─ Need offline with server-side CRUD?
│ │ └─ RemoteSaveAdaptor
│ └─ Custom format (non-standard)?
│ └─ CustomDataAdaptor
│
├─ OData Service?
│ ├─ OData v3 (legacy)?
│ │ └─ ODataAdaptor
│ └─ OData v4 (modern)?
│ └─ ODataV4Adaptor (with expand)
│
├─ GraphQL Endpoint?
│ └─ GraphQLAdaptor
│
├─ Legacy ASP.NET ASMX?
│ └─ WebMethodAdaptor
│
└─ Custom/Proprietary?
├─ Custom request/response format?
│ └─ CustomDataAdaptor
└─ Need complete adaptor override?
└─ CustomAdaptor
Documentation Navigation Guide
📄 Getting Started & Setup
Read: Getting Started
- Installation (@syncfusion/ej2-data)
- Browser requirements
- First DataManager example
- Local array binding
- Remote API binding
📄 Understand the Concepts
Read: Overview
- What is DataManager?
- Key features
- When to use DataManager
- Architecture
📄 Data Binding (Local & Remote)
Read: Data Binding
- Local arrays with JsonAdaptor
- Remote APIs (REST, OData)
- Error handling (HTTP 0, 400, 401, 404, 500)
- Promise patterns (.then/.catch)
- Async/await examples
- Loading states
📄 Build Complex Queries
Read: Querying
- from() - specify resource
- where() - 15+ filter operators (equal, contains, startswith, greaterThan, etc.)
- select() - column projection
- orderBy/sortBy - multiple sort columns
- take/skip - pagination
- group() - data grouping
- aggregate() - sum, avg, count, min, max
- Complex predicate-based filtering
📄 CRUD: Insert, Update, Delete
Read: CRUD Operations
- insert() - single & batch records
- update() & remove() with keyField parameter
- remove() - delete by ID
- saveChanges() - batch mixed operations
- Error handling & validation
- Response formats (Items/Count, result/count)
- Conflict resolution
📄 All 10 Adaptors Explained
Read: Adaptors Guide
- Complete adaptor decision tree
- Each adaptor with:
- When to use
- Configuration example
- Usage example
- Backend response format
- C# or JavaScript backend patterns
- Comparison matrix
- CORS configuration
📄 Middleware & Request Customization
Read: Applying Middleware Logic
- Pre-request middleware (add headers, tokens)
- Post-request middleware (transform responses)
- JWT authentication patterns
- Custom headers (static & dynamic)
- Request/response transformation
- Error handling with retry
- Middleware execution order
📄 Browser State Persistence
Read: State Persistence
- enablePersistence - save query state
- localStorage integration
- Excluding specific queries from persistence
- Reapplying saved state on reload
📄 Advanced Scenarios & Optimization
Read: Advanced Scenarios
- Offline mode (download once, filter client-side)
- Load-on-demand pagination
- Deferred execution (Promises)
- Async/await patterns
- Memory management
- Performance optimization
- Troubleshooting
📄 API References
Read: API - DataManager
- executeQuery() method
- executeLocal() method
- insert(), update(), remove()
- saveChanges() for batch operations
Read: API - Query
- All Query builder methods
- where(), select(), from(), group()
- take(), skip(), orderBy()
- aggregate(), expand()
Read: API - Deferred
- Promise-based async handling
- then(), catch(), finally()
- Error callbacks
Quick Start
Setup
import { DataManager, WebApiAdaptor, Query } from '@syncfusion/ej2-data';
const dataManager = new DataManager({
url: 'url/orders',
adaptor: new WebApiAdaptor()
});
Query Example
// Fetch with filtering & sorting
dataManager.executeQuery(
new Query()
.where('Freight', 'greaterThan', 30)
.sortByDescending('OrderDate')
.take(20)
).then((result) => {
console.log('Orders:', result.result);
console.log('Total:', result.count);
}).catch((error) => {
console.error('Error:', error);
});
CRUD Operations
// Insert (data first, then tableName)
await dataManager.insert({ CustomerID: 'VINET', Freight: 32.50 }, 'Orders');
// Update (keyField, value object, tableName)
await dataManager.update('OrderID',
{ OrderID: 10248, Freight: 45.50 },
'Orders'
);
// Delete (keyField, keyValue, tableName)
await dataManager.remove('OrderID', 10248, 'Orders');
Common Error Handling
HTTP Status Codes
| Status | Meaning | Solution |
|---|---|---|
| 0 | Network error | Check internet connection |
| 400 | Bad request | Verify data format |
| 401 | Unauthorized | Check authentication token |
| 403 | Forbidden | Verify permissions |
| 404 | Not found | Check endpoint URL |
| 409 | Conflict | Data already exists, refresh data |
| 500 | Server error | Check backend logs |
Error Handling Pattern
// Promise-based
dataManager.executeQuery(new Query())
.then((result) => {
// Success: result.result, result.count
})
.catch((error) => {
if (error.status === 401) {
console.error('Unauthorized - login required');
} else if (error.status === 500) {
console.error('Server error');
} else {
console.error('Error:', error.message);
}
});
// Async/Await
try {
const result = await dataManager.executeQuery(new Query());
console.log('Data:', result.result);
} catch (error) {
console.error('Error status:', error.status);
}
10 Key Properties
const config = {
url: 'api.example.com/orders', // Remote endpoint
json: localArray, // Local data array
adaptor: new WebApiAdaptor(), // Protocol handler
// Caching & Performance
enableCache: true, // Enable result caching
timeTillExpiration: 10 * 60 * 1000, // Cache TTL (10 mins, default: no expiry)
// Persistence
enablePersistence: true, // Enable state persistence
id: 'dataManager_1', // Persistence ID
ignoreOnPersist: ['temp', 'debug'], // Properties to exclude
// HTTP headers
crossDomain: true, // CORS enabled
offline: false, // Offline mode
timeZoneHandling: true // Timezone offset handling
};
Framework Variants
TypeScript
import { DataManager, WebApiAdaptor, Query } from '@syncfusion/ej2-data';
const dm = new DataManager({
url: 'api.example.com/orders',
adaptor: new WebApiAdaptor()
});
dm.executeQuery(new Query().take(10)).then((result) => {
console.log(result.result);
});
JavaScript (ES6)
const { DataManager, WebApiAdaptor, Query } = require('@syncfusion/ej2-data');
const dm = new DataManager({
url: 'api.example.com/orders',
adaptor: new WebApiAdaptor()
});
dm.executeQuery(new Query().take(10)).then((result) => {
console.log(result.result);
});
More from syncfusion/javascript-ui-controls-skills
syncfusion-javascript-gantt-chart
Implement Syncfusion Gantt Chart using JavaScript/TypeScript (Essential JS 2). Use this when working with ej2-gantt component for project scheduling, task dependencies, and timeline management. Covers full Gantt implementation including data binding, task scheduling, columns, resources, timeline configuration, WBS, resource view, critical path, baseline tracking, filtering, sorting, editing, and export functionality (Excel/PDF).
9syncfusion-javascript-maps
Guide to implementing Syncfusion Maps in TypeScript and JavaScript. Use this skill whenever the user needs to create interactive maps, add markers, visualize geographical data, work with map layers, apply color mapping, add annotations, configure legends, or handle map interactions and events. Works with TypeScript (module-based) and JavaScript (CDN/ES5).
8syncfusion-javascript-accumulation-chart
Implements Syncfusion JavaScript accumulation charts (Pie, Doughnut, Funnel, Pyramid) for proportional and percentage-based visualizations. Use when displaying categorical or proportional data. Covers legend and label configuration, interactivity, accessibility, and customization. Works with TypeScript (modules) and JavaScript (CDN/ES5).
8syncfusion-javascript-rich-text-editor
Implements the Syncfusion Rich Text Editor and Markdown Editor using TypeScript (ej2-richtexteditor). Supports both HTML (WYSIWYG) and Markdown modes via editorMode on a single RichTextEditor class. Use this skill for toolbar setup, image/media/table handling, inline or iframe editing, AI assistant, smart editing, import/export, and all content editor scenarios.
8syncfusion-javascript-chart
Implements Syncfusion JavaScript chart controls (Line, Area, Bar, Column, Pie, Polar, Radar, Waterfall, Stock). Use when building interactive data visualizations, dashboards, or real-time charts. Covers series and axes configuration, styling, animations, exporting, and technical indicators. Works with TypeScript (webpack/modules) and JavaScript (CDN/ES5).
8syncfusion-javascript-dropdowns
Comprehensive guide for implementing Syncfusion TypeScript dropdown components including AutoComplete, ComboBox, Mention, Dropdownlist and Multiselect. Use this when building selection interfaces, data binding, filtering, cascading dropdowns, custom templates, and accessible dropdown experiences.
7