
syncfusion-javascript-dropdowns
Comprehensive guide for implementing Syncfusion TypeScript dropdown components including AutoComplete, ComboBox, Mention, Dropdownlist, Multiselect, ListBox, and MultiColumn ComboBox. Use this when building selection interfaces, data binding, filtering, cascading dropdowns, dual list transfer, custom templates, and accessible dropdown experiences.
- Installs
- 72
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/syncfusion/javascript-ui-controls-skills --skill syncfusion-javascript-dropdowns- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads syncfusion-javascript-dropdowns automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Syncfusion javascript Dropdowns
DropDownList
The Syncfusion DropDownList component provides a single-select dropdown with support for local/remote data binding, filtering, grouping, custom templates, virtual scrolling, accessibility, and cascading patterns — all in TypeScript.
Documentation and Navigation Guide
Getting Started
📄 Read: references/dropdownlist-getting-started.md
- Installation and package dependencies
- Initializing DropDownList on input, select, and UL tags
- Binding a simple data array
- Configuring popup height and width
- First render with
appendTo
Data Binding
📄 Read: references/dropdownlist-data-binding.md
- Binding arrays of strings, JSON objects, and complex nested data
- Using
fieldsto map text, value, iconCss, groupBy, and disabled columns - Remote data with
DataManager(OData, ODataV4 adaptors) - Using
queryto filter/sort remote data - Primitive vs. object value binding (
allowObjectBinding)
Filtering
📄 Read: references/dropdownlist-filtering.md
- Enabling
allowFilteringand the filter bar - Handling the
filteringevent withupdateData - Filter types:
startsWith,endsWith,contains - Minimum character limit, case-sensitive filtering, diacritics (
ignoreAccent) debounceDelayfor performance- Highlighting matched characters with
highlightSearch - Limiting search result count
Grouping
📄 Read: references/dropdownlist-grouping.md
- Mapping
groupByfield for category-based grouping - Inline and fixed group headers
- HTML
<select>with<optgroup>support - Customizing group headers with
groupTemplate - Disabling the fixed group header via CSS
Templates
📄 Read: references/dropdownlist-templates.md
itemTemplate— customize each list itemvalueTemplate— customize the selected value displaygroupTemplate— customize group headersheaderTemplateandfooterTemplate— static popup header/footernoRecordsTemplateandactionFailureTemplate
Features and Configuration
📄 Read: references/dropdownlist-features.md
- Disabled items via
fields.disabledanddisableItemmethod - Clear selection with
showClearButtonor programmatically - Popup resize with
allowResize - Virtual scrolling with
enableVirtualizationfor large datasets - Incremental search (built-in)
floatLabelType,enabled,readonly,sortOrderhtmlAttributes,cssClass,width,zIndex
Events and Methods
📄 Read: references/dropdownlist-events-and-methods.md
changeevent withisInteractedflagopen,close,beforeOpen,select,dataBoundeventsactionBegin,actionComplete,actionFailurefor remote datafiltering,focus,blureventsshowPopup,hidePopup,addItem,getItems,getDataByValuedataBind,clear,refresh,destroy,focusIn,focusOut
Cascading DropDownList
📄 Read: references/dropdownlist-cascading.md
- Country → State → City cascading pattern
- Filtering child dropdown data using
changeevent andQuery - Calling
dataBindafter property changes - Preselecting items in cascading dropdowns
Style and Accessibility
📄 Read: references/dropdownlist-style-and-accessibility.md
- CSS classes for wrapper, icon, focus, hover, popup customization
- Float label with asterisk
- WAI-ARIA roles and attributes
- Full keyboard shortcut reference
- RTL support with
enableRtl - Localization with
L10n
API Reference
📄 Read: references/dropdownlist-api.md
- Complete property list with types and defaults
- All methods with parameters and return types
- All events with descriptions
FieldSettingsModelreference
Installation
npm install @syncfusion/ej2-dropdowns
npm audit
Quick Start
import { DropDownList } from '@syncfusion/ej2-dropdowns';
// Simple string array
let dropDownListObject: DropDownList = new DropDownList({
dataSource: ['Badminton', 'Cricket', 'Football', 'Golf', 'Tennis'],
placeholder: 'Select a game'
});
dropDownListObject.appendTo('#ddlelement');
<!-- index.html -->
<input type="text" id="ddlelement" />
Common Patterns
JSON Data with Field Mapping
import { DropDownList } from '@syncfusion/ej2-dropdowns';
let sportsData: { [key: string]: Object }[] = [
{ Id: 'game1', Game: 'Badminton' },
{ Id: 'game2', Game: 'Football' },
{ Id: 'game3', Game: 'Tennis' }
];
let ddl: DropDownList = new DropDownList({
dataSource: sportsData,
fields: { text: 'Game', value: 'Id' },
placeholder: 'Select a game'
});
ddl.appendTo('#ddlelement');
Remote Data with OData
import { DropDownList } from '@syncfusion/ej2-dropdowns';
import { Query, DataManager, ODataV4Adaptor } from '@syncfusion/ej2-data';
let ddl: DropDownList = new DropDownList({
dataSource: new DataManager({
url: 'url', // Replace with your trusted API endpoint
adaptor: new ODataV4Adaptor,
crossDomain: true // Enable only when the API origin differs from your app; use only with trusted endpoints
}),
query: new Query().from('Customers').select(['ContactName', 'CustomerID']).take(6),
fields: { text: 'ContactName', value: 'CustomerID' },
placeholder: 'Select a customer',
sortOrder: 'Ascending'
});
ddl.appendTo('#ddlelement');
Filtering with Search Box
import { DropDownList, FilteringEventArgs } from '@syncfusion/ej2-dropdowns';
import { DataManager, Query } from '@syncfusion/ej2-data';
let ddl: DropDownList = new DropDownList({
dataSource: searchData,
fields: { text: 'Country', value: 'Index' },
allowFiltering: true,
placeholder: 'Select a country',
filtering: (e: FilteringEventArgs) => {
let query = new Query();
query = e.text !== '' ? query.where('Country', 'startswith', e.text, true) : query;
e.updateData(searchData, query);
}
});
ddl.appendTo('#ddlelement');
Handling Value Change
let ddl: DropDownList = new DropDownList({
dataSource: sportsData,
fields: { text: 'Game', value: 'Id' },
placeholder: 'Select a game',
change: (args) => {
if (args.isInteracted) {
console.log('User selected:', args.value);
} else {
console.log('Programmatic change:', args.value);
}
}
});
Key Properties at a Glance
| Property | Type | Purpose |
|---|---|---|
dataSource | array | DataManager | Data to populate the list |
fields | FieldSettingsModel | Maps text, value, groupBy, iconCss, disabled |
value | string | number | boolean | object | Selected value |
text | string | Display text of selected item |
index | number | Index of selected item |
placeholder | string | Input placeholder text |
allowFiltering | boolean | Show filter bar |
enableVirtualization | boolean | Virtual scroll for large lists |
sortOrder | 'None' | 'Ascending' | 'Descending' | Sort list items |
showClearButton | boolean | Show clear (×) button |
enabled | boolean | Enable/disable the component |
readonly | boolean | Prevent user interaction |
popupHeight | string | number | Height of popup (default 300px) |
popupWidth | string | number | Width of popup (default 100%) |
MultiSelect
The Syncfusion TypeScript MultiSelect component is a feature-rich dropdown that allows users to select one or multiple values from a list. It supports data binding, filtering, grouping, cascading, custom templates, and comprehensive accessibility features.
Documentation Navigation Guide
Getting Started
📄 Read: references/multiselect-getting-started.md
- Installation and package setup
- CSS imports and theme configuration
- Element initialization (SELECT, UL, INPUT tags)
- Basic component setup with data
Data Binding & Sources
📄 Read: references/multiselect-data-binding.md
- Binding local data arrays (strings and objects)
- Connecting to remote data sources
- DataManager configuration with adapters
- Field mapping and data format specifications
Selection Modes & Values
📄 Read: references/multiselect-selection-modes.md
- Single and multiple selection modes
- Working with the
valueproperty (array of selected values) - Getting/setting selected values programmatically
- Selection change events and handlers
Checkbox & Multi-Select Features
📄 Read: references/multiselect-checkbox-multiselect.md
- Enabling checkbox mode for visual multi-select
- Select All / Unselect All functionality
- Delimiter mode vs visual chip display
- Customizing checkbox appearance
Filtering & Search
📄 Read: references/multiselect-filtering-search.md
- Enabling real-time filtering
- Custom filter logic and expressions
- Minimum character validation before search
- Case-sensitive and case-insensitive filtering
Grouping & Sorting
📄 Read: references/multiselect-grouping-sorting.md
- Grouping items by category field
- Sorting in ascending/descending order
- Custom group templates
- Hierarchical data grouping
Cascading Dropdowns
📄 Read: references/multiselect-cascading-dropdowns.md
- Two-level and multi-level cascading
- Handling parent-child data synchronization
- Remote data loading with cascading
- Resetting child dropdowns when parent changes
Customization & Templates
📄 Read: references/multiselect-customization-templates.md
- Item templates for list items
- Value templates for display area
- Group templates for grouped items
- Header and footer templates
- CSS customization and styling
Performance: Virtual Scrolling
📄 Read: references/multiselect-virtual-scrolling.md
- Enabling virtual scrolling for large datasets
- Performance optimization techniques
- Virtual scroll with filtering and grouping
- Memory and rendering considerations
Accessibility & Standards
📄 Read: references/multiselect-accessibility.md
- WCAG 2.2 compliance and standards
- Keyboard navigation (Arrow keys, Tab, Enter, Escape)
- ARIA attributes and roles
- Screen reader support and focus management
How-To & Troubleshooting
📄 Read: references/multiselect-how-to-guide.md
- Common implementation patterns and recipes
- Edge cases and workarounds
- Performance tips and best practices
- Troubleshooting common issues
API Reference
📄 Read: references/multiselect-api.md
- Complete list of all properties with types and defaults
- All public methods with parameter signatures and return types
- All events with their argument types and usage
FieldSettingsModelfield mapping reference- Event argument type definitions (
MultiSelectChangeEventArgs,SelectEventArgs,RemoveEventArgs,TaggingEventArgs,FilteringEventArgs, etc.) - Module injection guide for
CheckBoxSelectionandVirtualScroll
Quick Start Example
Basic Setup
import { MultiSelect } from '@syncfusion/ej2-dropdowns';
// Initialize with simple string data
const multiSelect = new MultiSelect({
dataSource: ['Apple', 'Banana', 'Orange', 'Mango'],
placeholder: 'Select fruits'
});
multiSelect.appendTo('#select');
Multi-Select with Checkboxes
import { MultiSelect, CheckBoxSelection } from '@syncfusion/ej2-dropdowns';
MultiSelect.Inject(CheckBoxSelection);
const multiSelect = new MultiSelect({
dataSource: [
{ id: '1', name: 'Apple' },
{ id: '2', name: 'Banana' },
{ id: '3', name: 'Orange' }
],
fields: { text: 'name', value: 'id' },
mode: 'CheckBox',
showSelectAll: true,
placeholder: 'Select fruits'
});
multiSelect.appendTo('#select');
With Filtering
import { MultiSelect, FilteringEventArgs } from '@syncfusion/ej2-dropdowns';
import { Query } from '@syncfusion/ej2-data';
const data = [
{ id: '1', city: 'New York' },
{ id: '2', city: 'Los Angeles' },
{ id: '3', city: 'Chicago' }
];
const multiSelect = new MultiSelect({
dataSource: data,
fields: { text: 'city', value: 'id' },
allowFiltering: true,
filtering: (e: FilteringEventArgs) => {
const query = new Query();
if (e.text !== '') {
query.where('city', 'startswith', e.text, true);
}
e.updateData(data, query);
},
placeholder: 'Search cities'
});
multiSelect.appendTo('#select');
Common Patterns
Pattern 1: Cascading Dropdowns
// Country dropdown
const countrySelect = new MultiSelect({
dataSource: countries,
fields: { text: 'name', value: 'id' },
change: () => {
const selectedCountry = countrySelect.value;
// Update state dropdown based on selected country
stateSelect.dataSource = states.filter(s => s.countryId === selectedCountry);
stateSelect.refresh();
}
});
countrySelect.appendTo('#country');
Pattern 2: Remote Data Binding
import { DataManager, ODataV4Adaptor, Query } from '@syncfusion/ej2-data';
const multiSelect = new MultiSelect({
dataSource: new DataManager({
url: 'url', // Replace with your trusted API endpoint
adaptor: new ODataV4Adaptor(),
crossDomain: true // Enable only when the API origin differs from your app; use only with trusted endpoints
}),
query: new Query().select(['ContactName', 'CustomerID']).take(10),
fields: { text: 'ContactName', value: 'CustomerID' },
placeholder: 'Select customer'
});
multiSelect.appendTo('#select');
Pattern 3: Custom Item Template
⚠️ Security note: Template strings use
${field}interpolation. If field values originate from user input or remote sources, sanitize/encode them before binding to prevent XSS injection.
const multiSelect = new MultiSelect({
dataSource: employees,
fields: { text: 'firstName', value: 'id' },
itemTemplate: '<div><span>${firstName}</span><span>${department}</span></div>',
valueTemplate: '<span>${firstName} - ${department}</span>',
placeholder: 'Select employee'
});
multiSelect.appendTo('#select');
Key Props Quick Reference
| Prop | Type | Default | Purpose |
|---|---|---|---|
dataSource | array | DataManager | [] | Bind data to component |
fields | FieldSettingsModel | {} | Map data fields (text, value, groupBy, iconCss) |
value | string[] | number[] | boolean[] | object[] | null | Get/set selected value(s) |
mode | 'Box' | 'Delimiter' | 'Default' | 'CheckBox' | 'Default' | Selection display mode |
allowFiltering | boolean | null | Enable search/filter functionality |
enableVirtualization | boolean | false | Enable virtual scrolling for performance |
itemTemplate | string | Function | null | Custom HTML for list items |
valueTemplate | string | Function | null | Custom HTML for selected display |
placeholder | string | null | Input placeholder text |
showSelectAll | boolean | false | Show Select All option in CheckBox mode |
enableGroupCheckBox | boolean | false | Enable group header checkboxes in CheckBox mode |
maximumSelectionLength | number | 1000 | Limit number of selectable items |
allowCustomValue | boolean | false | Allow entering values not in the list |
closePopupOnSelect | boolean | true | Keep popup open after each selection |
hideSelectedItem | boolean | true | Hide selected items from dropdown list |
delimiterChar | string | ',' | Separator character in Delimiter mode |
showClearButton | boolean | true | Show remove icon on each chip |
showDropDownIcon | boolean | false | Show dropdown arrow button |
enabled | boolean | true | Enable/disable component |
readonly | boolean | false | Make component read-only |
zIndex | number | 1000 | z-index of the popup element |
📘 For the complete API including all properties, methods, and events, see references/multiselect-api.md.
Related Features
- Data Formats: JSON, XML, OData, Web API
- Themes: Material, Bootstrap, Fabric, Tailwind
- Grouping: Group items by category with custom templates
- Sorting: Ascending, Descending sort orders
- Localization: Multi-language support
- RTL Support: Right-to-left language support
- Keyboard Navigation: Full keyboard accessibility
AutoComplete
The AutoComplete component displays a matched suggestion list as the user types into an input field. It extends ComboBox with filtering-first behavior — the popup opens only when the user types, not on focus (by default).
Key capabilities:
- Filter suggestions by
StartsWith,EndsWith, orContains(default) - Bind local arrays (strings, numbers, objects) or remote
DataManagersources - Highlight matched characters in the suggestion list
- Control minimum characters before filtering triggers (
minLength) - Handle or override filtering logic via the
filteringevent - Programmatically open/close the popup with
showPopup()/hidePopup() - Float label support and full accessibility/keyboard navigation
Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- Installation and package setup
- HTML element setup (
<input>) - Basic instantiation with
new AutoComplete() - Binding to the DOM with
appendTo() - CSS and theme imports
- Minimal working example
Filtering Configuration
📄 Read: references/filtering.md
filterType:StartsWith,EndsWith,ContainsminLength: minimum characters before filter runsignoreCase: case-sensitive vs case-insensitive searchfilteringevent: custom filter logic withupdateData()filter()method: programmatic filtering- Remote data filtering with
DataManager
Data Binding
📄 Read: references/data-binding.md
- Local string, number, and object arrays
fieldsmapping:text,value,iconCss,groupByqueryproperty withDataManagerhtmlAttributesfor custom HTML attributes- Remote data source patterns
Highlight & Suggestion Control
📄 Read: references/highlight-and-suggestions.md
highlight: visually highlight matched characterssuggestionCount: limit number of popup list itemsshowPopupButton: toggle the popup trigger buttonshowPopup()/hidePopup(): programmatic popup control
Customization & Accessibility
📄 Read: references/customization.md
floatLabelType:Never,Always,Auto- CSS class overrides and theming
- Keyboard navigation and ARIA support
- Disabled state
- RTL support
Virtualization
📄 Read: references/virtualization.md
AutoComplete.Inject(VirtualScroll)— required module injectionenableVirtualization: true— activate virtual scrolling- Local data virtualization with large arrays
- Remote data virtualization with
DataManager - Customizing batch size with
query.take() - Grouping with virtualization
Full API Reference
📄 Read: references/api.md
- All 37 properties with types, defaults, and TypeScript examples
- All 19 methods with full signatures, parameters, and return types
- All 18 events with event argument details and usage examples
- Covers:
actionFailureTemplate,allowCustom,allowObjectBinding,allowResize,autofill,cssClass,dataSource,debounceDelay,enablePersistence,enableRtl,enableVirtualization,enabled,fields,filterType,floatLabelType,footerTemplate,groupTemplate,headerTemplate,highlight,htmlAttributes,ignoreAccent,ignoreCase,isDeviceFullScreen,itemTemplate,locale,minLength,noRecordsTemplate,placeholder,popupHeight,popupWidth,query,readonly,showClearButton,showPopupButton,sortOrder,suggestionCount,value,width,zIndex - Use this when looking up a specific property, method, or event name
Quick Start
<!-- index.html -->
<input id="atc" type="text" />
import { AutoComplete } from '@syncfusion/ej2-dropdowns';
// Local string array
const sports: string[] = ['Badminton', 'Basketball', 'Cricket', 'Football', 'Hockey', 'Tennis'];
const atcObj: AutoComplete = new AutoComplete({
dataSource: sports,
placeholder: 'Find a sport'
});
atcObj.appendTo('#atc');
/* Import a built-in theme */
@import '../node_modules/@syncfusion/ej2/material.css';
Type any character — matching items appear in the suggestion popup. Press Enter or click a suggestion to select.
Common Patterns
Filter by StartsWith instead of Contains
const atcObj: AutoComplete = new AutoComplete({
dataSource: sports,
filterType: 'StartsWith',
placeholder: 'Search'
});
atcObj.appendTo('#atc');
Object data with field mapping
import { AutoComplete } from '@syncfusion/ej2-dropdowns';
const employees: { [key: string]: Object }[] = [
{ id: 1, name: 'Alice', dept: 'Engineering' },
{ id: 2, name: 'Bob', dept: 'Design' },
{ id: 3, name: 'Carol', dept: 'Engineering' }
];
const atcObj: AutoComplete = new AutoComplete({
dataSource: employees,
fields: { value: 'id', text: 'name', groupBy: 'dept' },
placeholder: 'Find employee'
});
atcObj.appendTo('#atc');
Custom filtering via event
import { AutoComplete, FilteringEventArgs } from '@syncfusion/ej2-dropdowns';
import { Query } from '@syncfusion/ej2-data';
const atcObj: AutoComplete = new AutoComplete({
dataSource: sports,
filtering: (e: FilteringEventArgs) => {
let query: Query = new Query().where('', 'startswith', e.text, true);
e.updateData(sports, query);
}
});
atcObj.appendTo('#atc');
Highlight matched text with limited suggestions
const atcObj: AutoComplete = new AutoComplete({
dataSource: sports,
highlight: true,
suggestionCount: 5,
placeholder: 'Search (max 5 results)'
});
atcObj.appendTo('#atc');
Key Properties
| Property | Type | Default | Purpose |
|---|---|---|---|
dataSource | Object[] | DataManager | string[] | [] | Data to search |
fields | FieldSettingsModel | { value: null, iconCss: null, groupBy: null } | Maps object keys to display/value |
filterType | FilterType | 'Contains' | How input is matched against data |
minLength | number | 1 | Min chars typed before filtering fires |
ignoreCase | boolean | true | Case-insensitive matching |
ignoreAccent | boolean | false | Ignore diacritic/accent characters when filtering |
highlight | boolean | false | Highlight matched chars in popup |
suggestionCount | number | 20 | Max items shown in popup |
autofill | boolean | false | Inline auto-fill of first matched item |
allowCustom | boolean | true | Allow values not in data source |
allowObjectBinding | boolean | false | Return full object as value on selection |
allowResize | boolean | false | Show resize handle on popup |
showPopupButton | boolean | false | Show dropdown arrow button |
showClearButton | boolean | true | Show ✕ clear button |
floatLabelType | FloatLabelType | 'Never' | Label float behavior |
htmlAttributes | { [key: string]: string } | {} | Extra HTML attributes on input |
query | Query | null | Custom query for DataManager |
debounceDelay | number | 300 | Delay (ms) before filter executes on keystroke |
sortOrder | SortOrder | null | Sort order of popup list: None, Ascending, Descending |
enableVirtualization | boolean | false | Virtual scrolling for large datasets |
isDeviceFullScreen | boolean | true | Fullscreen popup on mobile when filtering |
enablePersistence | boolean | false | Persist value across page reloads |
enableRtl | boolean | false | Right-to-left rendering |
popupHeight | string | number | '300px' | Height of suggestion popup |
popupWidth | string | number | '100%' | Width of suggestion popup |
zIndex | number | 1000 | Z-index of popup element |
Key Events:
| Event | Fires When |
|---|---|
filtering | Each keystroke — use e.updateData() to supply custom results |
change | Value changes via selection or user input |
select | User selects an item from the popup |
open / close | Popup opens or closes |
beforeOpen | Just before the popup opens |
focus / blur | Component gains or loses focus |
dataBound | Data source is populated in the popup |
actionBegin / actionComplete / actionFailure | Remote data fetch lifecycle |
customValueSpecifier | User types a value not in data source (allowCustom: true) |
resizeStart / resizing / resizeStop | Popup resize lifecycle (allowResize: true) |
created / destroyed | Component creation and destruction |
Key Methods: showPopup(), hidePopup(), filter(dataSource, query?, fields?), clear(), addItem(), disableItem(), getDataByValue(), getItems(), focusIn(), focusOut(), showSpinner(), hideSpinner(), refresh(), destroy().
ComboBox
The ComboBox component allows the user to type a value directly into the input or choose an option from the dropdown list of predefined options. It is the flexible middle ground between a plain text input and a strict DropDownList — users are not forced to pick an existing item unless allowCustom is set to false.
Key differentiators from DropDownList:
- Users can type freely; custom values are accepted by default (
allowCustom: true) autofillsuggests the first matching item inline as the user typescustomValueSpecifierevent lets you format and transform user-typed custom values- Supports
allowFilteringwith an inline search experience (no separate filter bar)
Component Overview
| Capability | ComboBox Behavior |
|---|---|
| User input | Editable — user types directly in the input field |
| Custom values | Allowed by default (allowCustom: true) |
| Inline suggestion | Optional via autofill: true |
| Filtering | Optional via allowFiltering: true + filtering event |
| Virtualization | Supported via ComboBox.Inject(VirtualScroll) |
| Data binding | Local arrays, object arrays, DataManager (remote) |
| Object binding | Full object value binding via allowObjectBinding: true |
Documentation and Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- Installation and package setup
- CSS/theme import
- HTML element setup (
<select>or<input>) - Basic instantiation with
new ComboBox({}).appendTo('#id') - Initializing
value,text,index showClearButton,placeholder,width- Destroying the component
Data Binding
📄 Read: references/data-binding.md
- Local string arrays
- Local object arrays with
fieldsmapping (text,value,groupBy) htmlAttributesfor input element customization- Remote data with
DataManager queryproperty for custom data queriesallowObjectBindingfor full object value binding
Filtering
📄 Read: references/filtering.md
- Enabling search with
allowFiltering: true filteringevent andFilteringEventArgsusagefilter()method for local and remote custom filteringisDeviceFullScreenbehavior on mobile- No-match template handling
Custom Values
📄 Read: references/custom-values.md
allowCustom: true/false— controlling whether typed values are acceptedautofill— inline suggestion as user typescustomValueSpecifierevent for formatting custom typed valuesCustomValueSpecifierEventArgsinterface (text,item)- Clearing custom values with
clear()andshowClearButton allowObjectBindingcombined with custom values
Customization
📄 Read: references/customization.md
floatLabelType:Never/Always/AutocssClassfor custom stylingheaderTemplate/footerTemplatefor popup header and footerplaceholder,width,popupHeight,popupWidthreadonlymode- Popup control:
showPopup()/hidePopup() - Focus control:
focusIn()/focusOut() - Spinner:
showSpinner()/hideSpinner()
Virtualization
📄 Read: references/virtualization.md
- ⚠️ Required module injection:
ComboBox.Inject(VirtualScroll) enableVirtualization: truefor large datasets- Local data virtualization
- Remote
DataManagervirtualization - Interaction with
allowCustomandallowFiltering
Full API Reference
📄 Read: references/api.md
- All 37 public properties with types, defaults, and examples
- 18 events with argument interfaces
- 19 methods with signatures and usage
CustomValueSpecifierEventArgsinterface
Quick Start
import { ComboBox } from '@syncfusion/ej2-dropdowns';
import '@syncfusion/ej2-base/styles/material.css';
import '@syncfusion/ej2-inputs/styles/material.css';
import '@syncfusion/ej2-popups/styles/material.css';
import '@syncfusion/ej2-dropdowns/styles/material.css';
const sportsData: string[] = ['Badminton', 'Basketball', 'Cricket', 'Football', 'Tennis'];
const comboBox: ComboBox = new ComboBox({
dataSource: sportsData,
placeholder: 'Select or type a sport',
allowCustom: true
});
comboBox.appendTo('#combo-element');
<input id="combo-element" />
Common Patterns
Allow Only Existing Values
const comboBox: ComboBox = new ComboBox({
dataSource: sportsData,
allowCustom: false, // reject values not in the list
placeholder: 'Select a sport'
});
comboBox.appendTo('#combo-element');
Inline Autofill Suggestion
const comboBox: ComboBox = new ComboBox({
dataSource: sportsData,
autofill: true, // suggests first match inline as user types
placeholder: 'Start typing...'
});
comboBox.appendTo('#combo-element');
Filtering with Remote Data
import { ComboBox, FilteringEventArgs } from '@syncfusion/ej2-dropdowns';
import { DataManager, ODataV4Adaptor, Query } from '@syncfusion/ej2-data';
const comboBox: ComboBox = new ComboBox({
dataSource: new DataManager({ url: 'url', adaptor: new ODataV4Adaptor() }),
fields: { text: 'ContactName', value: 'CustomerID' },
allowFiltering: true,
filtering: (args: FilteringEventArgs) => {
const query = new Query().select(['ContactName', 'CustomerID']).take(6);
args.updateData(comboBox.dataSource as DataManager, query);
},
placeholder: 'Search customers'
});
comboBox.appendTo('#combo-element');
Custom Value Formatting
import { ComboBox, CustomValueSpecifierEventArgs } from '@syncfusion/ej2-dropdowns';
const comboBox: ComboBox = new ComboBox({
dataSource: [{ text: 'Cricket', id: '1' }],
fields: { text: 'text', value: 'id' },
allowCustom: true,
customValueSpecifier: (args: CustomValueSpecifierEventArgs) => {
args.item = { text: args.text, id: args.text.toLowerCase() };
}
});
comboBox.appendTo('#combo-element');
Key Properties
| Property | Type | Default | Purpose |
|---|---|---|---|
dataSource | Object[] | DataManager | string[] | [] | Data for the dropdown list |
fields | FieldSettingsModel | {} | Map text, value, groupBy keys |
value | number | string | boolean | object | null | null | Selected value |
text | string | null | null | Display text of selected item |
index | number | null | null | Index of selected item |
allowCustom | boolean | true | Allow user-typed values not in list |
autofill | boolean | false | Inline suggestion while typing |
allowFiltering | boolean | false | Show search box in popup |
showClearButton | boolean | true | Show ✕ button to clear selection |
placeholder | string | null | Input placeholder text |
floatLabelType | FloatLabelType | 'Never' | Floating label behavior |
readonly | boolean | false | Disable user interaction |
allowObjectBinding | boolean | false | Bind full object as value |
enableVirtualization | boolean | false | Enable virtual scrolling ⚠️ requires Inject |
Mention
The Mention component monitors a target element (textarea, input, or contenteditable div) and opens a suggestion popup when the user types a configured trigger character (default @). The user selects an item and it is inserted as a styled chip into the target element.
Key capabilities:
- Attach to any
<textarea>,<input>, orcontenteditableelement viatarget - Configurable trigger character via
mentionChar(default@) - Bind local arrays (strings, objects) or remote
DataManagersources - Filter suggestions with
StartsWith,EndsWith, orContains(default) - Highlight matched characters in the popup via
highlight - Customize the popup item layout with
itemTemplateand the inserted chip withdisplayTemplate - Control when the popup opens:
minLength,requireLeadingSpace,debounceDelay - Handle selection, change, and filtering with events
- Programmatically trigger search with
search()and manage items withdisableItem()/addItem()
Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- Installation and package setup
- CSS and theme imports
- HTML target element setup (textarea, input, contenteditable)
- Basic instantiation:
new Mention({ target: '#myTextarea', dataSource: [...] }) appendTo()usagementionChar— trigger character configuration- Minimal working example
Data Binding
📄 Read: references/data-binding.md
- Local string and number arrays
- Object arrays with
fieldsmapping (text,value,iconCss,groupBy) - Remote
DataManagerwithactionBegin/actionComplete/actionFailureevents queryproperty for custom data queriessortOrder:None/Ascending/DescendingactionFailureTemplatefor remote error handling
Filtering
📄 Read: references/filtering.md
filterType:StartsWith,EndsWith,ContainsminLength: minimum characters before popup appearsignoreCaseandignoreAccentfor flexible matchingdebounceDelay: performance tuning for keystroke filteringfilteringevent andFilteringEventArgs— custom filter logic withupdateData()- Remote data filtering patterns
Popup and Display
📄 Read: references/popup-and-display.md
target: binding to textarea, input, or contenteditablerequireLeadingSpace: enforce space before@allowSpaces: allow spaces within a mention searchpopupWidth/popupHeightsizingshowPopup()/hidePopup()programmatic controlzIndexfor layeringnoRecordsTemplate/spinnerTemplatebeforeOpen,opened,closedpopup lifecycle events
Templates and Customization
📄 Read: references/templates-and-customization.md
itemTemplate: customize each suggestion item in the popupdisplayTemplate: customize the inserted chip HTMLgroupTemplate: group header rendering in popupshowMentionChar: include@in the inserted chipsuffixText: append a space or newline after insertionhighlight: bold matched characters in suggestionscssClassfor component-level styling
Events and Methods
📄 Read: references/events-and-methods.md
selectevent (SelectEventArgs) — fires when user picks an itemchangeevent (MentionChangeEventArgs) — value, previousItem, elementfilteringevent — intercept and override suggestion datasearch(text, x, y)— programmatic search trigger at screen coordinatesdisableItem(item)— disable a specific popup itemaddItem(items, index?)— add new items to the suggestion listgetItems()/getDataByValue(value)— query list statecreated/destroyedlifecycle events
Full API Reference
📄 Read: references/api.md
- All 30 public properties with types, defaults, and descriptions
- All 15 methods with signatures, parameters, and return types
- All 12 events with event argument interface details
MentionChangeEventArgsinterface fields- Use this reference when looking up a specific property, method, or event
Quick Start
<!-- index.html -->
<textarea id="mentionTarget" rows="5" cols="40" placeholder="Type @ to mention someone"></textarea>
<div id="mention-default"></div>
import { Mention } from '@syncfusion/ej2-dropdowns';
const userData: { [key: string]: Object }[] = [
{ name: 'Alice', id: 'alice' },
{ name: 'Bob', id: 'bob' },
{ name: 'Carol', id: 'carol' },
{ name: 'David', id: 'david' }
];
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: userData,
fields: { text: 'name', value: 'id' }
});
mentionObj.appendTo('#mention-default');
/* Import a built-in theme */
@import '../node_modules/@syncfusion/ej2/material.css';
Type @ in the textarea — the suggestion popup opens. Type more characters to filter. Press Enter, Tab, or click to insert the selected item as a chip.
Common Patterns
Custom trigger character
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: ['JavaScript', 'TypeScript', 'Python', 'Rust'],
mentionChar: '#' // use # as trigger instead of @
});
mentionObj.appendTo('#mention-default');
Require minimum characters before popup opens
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: userData,
fields: { text: 'name', value: 'id' },
minLength: 2 // popup only appears after typing @ + 2 characters
});
mentionObj.appendTo('#mention-default');
Highlight matched text and limit suggestion count
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: userData,
fields: { text: 'name', value: 'id' },
highlight: true,
suggestionCount: 5
});
mentionObj.appendTo('#mention-default');
Allow spaces within a mention search
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: [
{ name: 'Alice Smith', id: '1' },
{ name: 'Bob Jones', id: '2' }
],
fields: { text: 'name', value: 'id' },
allowSpaces: true // typing "@Alice Smith" still searches
});
mentionObj.appendTo('#mention-default');
Show @-symbol in the inserted chip
const mentionObj: Mention = new Mention({
target: '#mentionTarget',
dataSource: userData,
fields: { text: 'name', value: 'id' },
showMentionChar: true, // chip reads "@Alice" instead of "Alice"
suffixText: ' ' // insert a space after the chip
});
mentionObj.appendTo('#mention-default');
Key Properties
| Property | Type | Default | Purpose |
|---|---|---|---|
target | HTMLElement | string | — | Required. The element to monitor for the trigger character |
dataSource | Object[] | DataManager | string[] | [] | Suggestion list data |
fields | FieldSettingsModel | { text: null, value: null, iconCss: null, groupBy: null } | Map object keys |
mentionChar | string | '@' | Character that opens the popup |
minLength | number | 0 | Min chars after trigger before popup shows |
suggestionCount | number | 25 | Max items shown in popup |
filterType | FilterType | 'Contains' | Match strategy for typed characters |
ignoreCase | boolean | true | Case-insensitive matching |
highlight | boolean | false | Bold matched characters in suggestions |
allowSpaces | boolean | false | Allow spaces within the mention search string |
requireLeadingSpace | boolean | true | Require a space before @ to trigger |
showMentionChar | boolean | false | Prefix inserted chip text with mentionChar |
suffixText | string | null | Text appended after the inserted chip (e.g. ' ') |
debounceDelay | number | 300 | Milliseconds to wait before filtering |
popupHeight | string | number | '300px' | Popup list height |
popupWidth | string | number | 'auto' | Popup list width |
Key Events: select (item picked), change (value updated in editor), filtering (custom filter logic), beforeOpen / opened / closed (popup lifecycle).
Key Methods: showPopup(), hidePopup(), search(text, x, y), disableItem(item), addItem(items, index?), destroy().
ListBox
The Syncfusion TypeScript ListBox component renders a scrollable list of items from which users can select one or multiple values. Unlike a dropdown, it is always visible — making it ideal for available/selected item lists, permission assignment interfaces, and preference panels. It supports drag-and-drop, toolbar-based dual-list transfer, filtering, grouping, sorting, and checkbox selection.
Key capabilities:
- Single or multiple selection via
selectionSettings.mode - Checkbox selection with "Select All" — requires
ListBox.Inject(CheckBoxSelection) - Drag-and-drop reordering within a single list or between two lists via
allowDragAndDrop+scope - Dual-list (transfer list) pattern with
scope+toolbarSettings.items - Filter bar via
allowFiltering+filteringevent for custom logic - Sort data with
sortOrder: 'Ascending' | 'Descending' - Custom item rendering with
itemTemplate - Enable/disable individual items with
enableItems()orfields.disabled - Full programmatic API:
addItems,removeItems,selectItems,moveTo,moveAllTo,getDataList
Documentation and Navigation Guide
Getting Started
📄 Read: references/listbox-getting-started.md
- Installation:
npm install @syncfusion/ej2-dropdowns - CSS theme imports (tailwind3, material, bootstrap5, fluent, fabric)
- HTML setup:
<div id="listbox"></div> - Basic ListBox with static data
changeevent handler- Multiple selection
- Troubleshooting common setup issues
Data Binding
📄 Read: references/listbox-data-binding.md
- Simple string array binding
- Object arrays with
fieldsmapping (text,value,iconCss,disabled) - Grouping with
fields.groupBy - Dynamic data:
addItems,dataBind - Remote data with
DataManagerandODataV4Adaptor
Selection
📄 Read: references/listbox-selection.md
- Single selection (
selectionSettings.mode: 'Single') - Multiple selection (default)
- Pre-select via
value: ['id1', 'id2'] maximumSelectionLengthto cap selections- Checkbox selection:
ListBox.Inject(CheckBoxSelection)+selectionSettings.showCheckbox: true - "Select All" with
selectionSettings.showSelectAll: true - Programmatic select/deselect via
selectItems()andselectAll() - Get selected data with
getDataByValues()
Features
📄 Read: references/listbox-features.md
- Filter bar:
allowFiltering,filterBarPlaceholder,filterType - Custom filter via
filteringevent +args.updateData() - Sorting with
sortOrder: 'Ascending' | 'Descending' - Drag-and-drop within a single list and between two lists using
scope - Enable/disable items with
enableItems()orfields.disabled - Fixed height with scroll
Dual ListBox (Transfer List)
📄 Read: references/listbox-dual-list-box.md
- Two-ListBox wiring via
scope: '#target-id'+toolbarSettings.items - All 6 toolbar operations:
moveUp,moveDown,moveTo,moveFrom,moveAllTo,moveAllFrom - Reorder-only pattern, one-direction transfer, bidirectional transfer
- Toolbar position (
Left/Right) - Programmatic transfer:
moveTo,moveAllTo,moveUp,moveDown,moveTop,moveBottom - Read updated state with
getDataList() - Permission assignment example
Icons and Templates
📄 Read: references/listbox-icons-and-templates.md
- Icon CSS via
fields.iconCss - Emoji icons in text field
itemTemplatewith${}string template syntax- Template with icon + description layout
- Template with status badge
noRecordsTemplatecustomization
Style and Appearance
📄 Read: references/listbox-style-and-appearance.md
- CSS theme imports (tailwind3 / material / bootstrap5 / fluent / fabric)
- Override CSS classes:
.e-listbox-wrapper,.e-list-item,.e-selected,.e-disabled,.e-list-group-item cssClassfor scoped custom styles- Conditional item styling with
itemTemplate+ CSS - Responsive
heightandwidth, RTL support
Accessibility
📄 Read: references/listbox-accessibility.md
- WCAG 2.2 AA / Section 508 / ARIA 1.2 compliance
- Auto-applied ARIA attributes (
role,aria-multiselectable,aria-selected) - Custom ARIA via
htmlAttributes - Keyboard shortcuts table (Arrow, Space, Enter, Home, End, Shift+Arrow, Ctrl+A)
- Screen reader label association with
<label>andaria-live - RTL:
enableRtl: trueor globalenableRtl(true)
How-To Guides
📄 Read: references/listbox-how-to-guides.md
- Add single/multiple items with
addItems() - Prevent duplicate items
- Select items programmatically with
selectItems() - Enable/disable items with
enableItems() - Custom filter logic with
filteringevent - Fixed height scroller
- Form integration: read selections with
getDataByValues()on submit
API Reference
📄 Read: references/listbox-api.md
- All properties with types and defaults
- All methods:
addItems,enableItems,filter,getDataByValue,getDataByValues,getDataList,getItems,getSortedList,moveAllTo,moveBottom,moveDown,moveTo,moveTop,moveUp,removeItem,removeItems,selectAll,selectItems - All events:
change,created,dataBound,destroyed,drag,dragStart,drop,filtering,beforeDrop,beforeItemRender - Sub-interfaces:
FieldSettingsModel,SelectionSettingsModel,ToolbarSettingsModel
Quick Start
<!-- index.html -->
<link href="node_modules/@syncfusion/ej2-base/styles/tailwind3.css" rel="stylesheet" />
<link href="node_modules/@syncfusion/ej2-inputs/styles/tailwind3.css" rel="stylesheet" />
<link href="node_modules/@syncfusion/ej2-dropdowns/styles/tailwind3.css" rel="stylesheet" />
<div id="listbox"></div>
import { ListBox } from '@syncfusion/ej2-dropdowns';
const data: { [key: string]: Object }[] = [
{ text: 'JavaScript', id: '1' },
{ text: 'TypeScript', id: '2' },
{ text: 'React', id: '3' },
{ text: 'Angular', id: '4' },
{ text: 'Vue', id: '5' }
];
const listBox: ListBox = new ListBox({
dataSource: data,
fields: { text: 'text', value: 'id' },
change: (args) => {
console.log('Selected values:', args.value);
}
});
listBox.appendTo('#listbox');
With Checkbox Selection
import { ListBox, CheckBoxSelection } from '@syncfusion/ej2-dropdowns';
ListBox.Inject(CheckBoxSelection); // Must be called before instantiation
const listBox: ListBox = new ListBox({
dataSource: data,
fields: { text: 'text', value: 'id' },
selectionSettings: {
showCheckbox: true,
showSelectAll: true
}
});
listBox.appendTo('#listbox');
Dual ListBox (Transfer List)
<div id="available"></div>
<div id="selected"></div>
import { ListBox } from '@syncfusion/ej2-dropdowns';
const available: ListBox = new ListBox({
dataSource: data,
fields: { text: 'text', value: 'id' },
scope: '#selected',
toolbarSettings: {
items: ['moveTo', 'moveFrom', 'moveAllTo', 'moveAllFrom']
}
});
const selected: ListBox = new ListBox({
dataSource: [],
fields: { text: 'text', value: 'id' }
});
available.appendTo('#available');
selected.appendTo('#selected');
Common Patterns
Pattern 1: Checkbox Selection with "Select All"
import { ListBox, CheckBoxSelection } from '@syncfusion/ej2-dropdowns';
ListBox.Inject(CheckBoxSelection);
const listBox: ListBox = new ListBox({
dataSource: frameworksData,
fields: { text: 'text', value: 'id' },
selectionSettings: { showCheckbox: true, showSelectAll: true },
maximumSelectionLength: 3 // Allow up to 3 checkboxes
});
listBox.appendTo('#listbox');
Pattern 2: Filtering
const listBox: ListBox = new ListBox({
dataSource: data,
fields: { text: 'text', value: 'id' },
allowFiltering: true,
filterBarPlaceholder: 'Search frameworks...',
filterType: 'Contains'
});
listBox.appendTo('#listbox');
Pattern 3: Read Selected Items on Form Submit
document.getElementById('submitBtn')!.addEventListener('click', () => {
const selectedValues = listBox.value as string[];
const selectedItems = listBox.getDataByValues(selectedValues);
console.log('Submitted:', selectedItems);
});
Key Properties
| Property | Type | Default | Purpose |
|---|---|---|---|
dataSource | array | DataManager | [] | Data to display in the list |
fields | FieldSettingsModel | {} | Map text, value, iconCss, groupBy, disabled |
value | string[] | number[] | boolean[] | [] | Pre-selected or currently selected values |
selectionSettings | SelectionSettingsModel | { mode: 'Multiple' } | Selection mode and checkbox options |
toolbarSettings | ToolbarSettingsModel | { items: [] } | Dual ListBox toolbar configuration |
scope | string | '' | Target ListBox ID for drag-and-drop or toolbar transfer |
allowFiltering | boolean | false | Show filter/search bar |
allowDragAndDrop | boolean | false | Enable drag-and-drop reordering |
sortOrder | SortOrder | null | Sort items: 'Ascending' | 'Descending' |
height | string | number | '' | Fixed height with scroll |
itemTemplate | string | Function | null | Custom item rendering template |
maximumSelectionLength | number | 1000 | Maximum number of selectable items |
enableRtl | boolean | false | Right-to-left rendering |
cssClass | string | '' | Custom CSS class for scoped styling |
MultiColumn ComboBox
The Syncfusion EJ2 JavaScript MultiColumnComboBox renders a combo box with a multi-column popup grid, enabling users to select from structured tabular data. It supports local and remote data, filtering, sorting, grouping, templates, virtualization, and full accessibility compliance.
Package: @syncfusion/ej2-multicolumn-combobox
Navigation Guide
Getting Started
📄 Read: references/multicolumn-combobox-getting-started.md
- Installation and package setup (
npm install @syncfusion/ej2-multicolumn-combobox) - CSS imports and theme configuration (Tailwind 3, Material, Bootstrap 5, Fluent, Fabric)
- HTML
<input>target setup new MultiColumnComboBox({...}).appendTo('#id')initialization- Binding
dataSource,fields, andcolumns: ColumnModel[] - Configuring
popupHeightandpopupWidth - Minimal working example
Columns
📄 Read: references/multicolumn-combobox-columns.md
- Defining columns with
ColumnModel(field, header, width, textAlign) templatefor cell-level custom renderingdisplayAsCheckBoxfor boolean columnscustomAttributesfor column CSS customizationheaderTemplatefor custom column headersformatfor data formatting (C2 for currency, date skeletons)
Data Binding
📄 Read: references/multicolumn-combobox-data-binding.md
- Binding local object arrays via
dataSource - Remote data binding with
DataManagerandWebApiAdaptor/ODataAdaptor/ODataV4Adaptor - Mapping
fields(text,value,groupBy) - Using
queryproperty for filtered/limited data sets
Filtering
📄 Read: references/multicolumn-combobox-filtering.md
- Enabling/disabling filtering with
allowFiltering - Changing filter mode with
filterType(StartsWith,EndsWith,Contains) filteringevent for custom filter logic- Disabling filtering for read-only scenarios
Sorting
📄 Read: references/multicolumn-combobox-sorting.md
- Enabling sorting with
allowSorting - Setting initial sort order with
sortOrder(None,Ascending,Descending) - Sorting multiple columns with
sortType(OneColumn,MultipleColumns) - Clicking column headers to toggle sort direction
Grouping
📄 Read: references/multicolumn-combobox-grouping.md
- Grouping data with
fields.groupBy - Fixed group headers in popup
- Using
groupTemplateto customize group headers (${key},${field},${count}tokens)
Templates
📄 Read: references/multicolumn-combobox-templates.md
itemTemplatefor customizing each rowheaderTemplate(onColumnModel) for custom column headersgroupTemplatefor group header customizationfooterTemplatefor popup footer contentnoRecordsTemplatefor empty state displayactionFailureTemplatefor remote fetch error state
Items and Configuration
📄 Read: references/multicolumn-combobox-items.md
- Setting initial selection with
text,value,index placeholderandfloatLabelTypefor input label behaviorshowClearButtonto allow clearing selectiondisabledandreadonlystateswidth,popupWidth,popupHeightfor sizingcssClassfor custom stylinghtmlAttributesfor additional HTML attributesgridSettingsfor grid lines, row height, and alternate rows- Programmatic methods:
addItems,focusIn,focusOut,showPopup,hidePopup,getDataByValue,getItems
Virtualization
📄 Read: references/multicolumn-combobox-virtualization.md
- Enabling
enableVirtualizationfor large datasets - Virtual scrolling with local and remote data
- Combining with
gridSettings.rowHeightfor accurate positioning - Best practices for datasets of 100+ items
Events
📄 Read: references/multicolumn-combobox-events.md
change— fired when value changes or item is selectedselect— fired on item selectionopen/close— popup open/close lifecyclefiltering— fired on character input for custom filteringactionBegin/actionComplete/actionFailure— data fetch lifecyclecreated— post-render lifecycle hook
Localization
📄 Read: references/multicolumn-combobox-localization.md
- Localizing
noRecordsTemplatetext usingL10n.load()with the'multicolumncombobox'locale key - Setting
localeproperty for culture-specific rendering - Loading translation objects
- BCP 47 language tags (e.g.
'en-US','fr-BE','de')
Accessibility
📄 Read: references/multicolumn-combobox-accessibility.md
- WCAG 2.2 and Section 508 compliance
- WAI-ARIA attributes (
role="combobox",aria-expanded,aria-selected,aria-readonly,aria-disabled,aria-owns) - Keyboard navigation shortcuts (
Alt+Down/Alt+Up, Arrow keys,PageUp/PageDown,Enter,Esc,Home,End) - RTL support with
enableRtl: true - Screen reader support
API Reference
📄 Read: references/multicolumn-combobox-api.md
- Complete list of all properties with types and defaults
- All events with their argument types
- All methods:
addItems,focusIn,focusOut,getDataByValue,getItems,showPopup,hidePopup ColumnModelproperties (field, header, width, textAlign, template, headerTemplate, displayAsCheckBox, customAttributes, format)GridSettingsModelproperties (rowHeight, gridLines, enableAltRow)FieldSettingsModelproperties (text, value, groupBy)
Quick Start
// app.ts
import { MultiColumnComboBox, ColumnModel } from '@syncfusion/ej2-multicolumn-combobox';
const empData: { [key: string]: Object }[] = [
{ EmpID: 1001, Name: 'Andrew Fuller', Designation: 'Team Lead', Country: 'England' },
{ EmpID: 1002, Name: 'Robert', Designation: 'Developer', Country: 'USA' },
{ EmpID: 1003, Name: 'Michael', Designation: 'HR', Country: 'Russia' },
{ EmpID: 1004, Name: 'Steven Buchanan', Designation: 'Product Manager', Country: 'Ukraine' }
];
const fields: object = { text: 'Name', value: 'EmpID' };
const columns: ColumnModel[] = [
{ field: 'EmpID', header: 'Employee ID', width: 120 },
{ field: 'Name', header: 'Name', width: 120 },
{ field: 'Designation', header: 'Designation', width: 120 },
{ field: 'Country', header: 'Country', width: 100 }
];
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: empData,
fields: fields,
columns: columns,
placeholder: 'Select an employee'
});
mccBox.appendTo('#multicolumn');
<!-- index.html -->
<input type="text" id="multicolumn" />
/* styles.css */
@import '~@syncfusion/ej2-base/styles/tailwind3.css';
@import '~@syncfusion/ej2-inputs/styles/tailwind3.css';
@import '~@syncfusion/ej2-grids/styles/tailwind3.css';
@import '~@syncfusion/ej2-popups/styles/tailwind3.css';
@import '~@syncfusion/ej2-multicolumn-combobox/styles/tailwind3.css';
Common Patterns
Pre-select an item by text
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: empData,
fields: fields,
text: 'Michael',
columns: columns
});
mccBox.appendTo('#multicolumn');
Enable filtering with Contains mode
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: empData,
fields: fields,
allowFiltering: true,
filterType: 'Contains',
columns: columns
});
mccBox.appendTo('#multicolumn');
Enable sorting (descending) with multi-column support
import { MultiColumnComboBox, SortOrder, ColumnModel } from '@syncfusion/ej2-multicolumn-combobox';
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: empData,
fields: fields,
allowSorting: true,
sortOrder: SortOrder.Descending,
sortType: 'MultipleColumns',
columns: columns
});
mccBox.appendTo('#multicolumn');
Remote data binding with OData v4 (security-first)
Security: Do not call arbitrary third-party endpoints from client-side code. Route external API requests through a trusted server-side proxy that validates, authenticates, and sanitizes responses.
import { MultiColumnComboBox, ColumnModel } from '@syncfusion/ej2-multicolumn-combobox';
import { DataManager, ODataV4Adaptor } from '@syncfusion/ej2-data';
// Use a trusted server-side proxy. Do not embed third-party URLs directly.
const dataSource: DataManager = new DataManager({
url: 'https://your-trusted-proxy.example/api/customers',
adaptor: new ODataV4Adaptor(),
crossDomain: true
});
const fields: object = { text: 'FirstName', value: 'EmployeeID' };
const columns: ColumnModel[] = [
{ field: 'EmployeeID', header: 'Employee ID', width: 120 },
{ field: 'FirstName', header: 'Name', width: 130 },
{ field: 'Designation', header: 'Designation', width: 120 },
{ field: 'Country', header: 'Country', width: 90 }
];
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: dataSource,
fields: fields,
placeholder: 'Select a name',
popupHeight: '230px',
columns: columns
});
mccBox.appendTo('#multicolumn');
Handle the value change event
import { MultiColumnComboBox, ChangeEventArgs } from '@syncfusion/ej2-multicolumn-combobox';
const mccBox: MultiColumnComboBox = new MultiColumnComboBox({
dataSource: empData,
fields: fields,
columns: columns,
change: (args: ChangeEventArgs) => {
console.log('Selected value:', args.value);
console.log('Display text:', args.text);
console.log('Item data:', args.itemData);
}
});
mccBox.appendTo('#multicolumn');
Key Properties
| Property | Type | Default | Purpose |
|---|---|---|---|
dataSource | Object[] | DataManager | [] | Data to populate the popup grid |
fields | FieldSettingsModel | {text:null, value:null, groupBy:null} | Maps data keys to display text, hidden value, and group-by |
columns | ColumnModel[] | [] | Column definitions for the popup grid |
value | string | null | Pre-selects an item by its value |
text | string | null | Pre-selects an item by its display text |
index | number | null | Pre-selects an item by zero-based index |
placeholder | string | null | Hint text for the input |
floatLabelType | 'Never' | 'Always' | 'Auto' | 'Never' | Floating label behavior |
allowFiltering | boolean | true | Enables the filter input |
filterType | 'StartsWith' | 'EndsWith' | 'Contains' | 'StartsWith' | Filter match strategy |
allowSorting | boolean | true | Enables column-header sorting |
sortOrder | SortOrder | SortOrder.None | Initial sort direction |
sortType | SortType | 'OneColumn' | One or multi-column sort |
enableVirtualization | boolean | false | Virtual scrolling for large datasets |
enableRtl | boolean | false | Right-to-left rendering |
enablePersistence | boolean | false | Persist value across page reloads |
readonly | boolean | false | Prevent user input |
disabled | boolean | false | Fully disable the component |
showClearButton | boolean | false | Show a clear (×) button |
cssClass | string | '' | Custom CSS class on the root element |
popupHeight | string | number | '300px' | Height of the popup |
popupWidth | string | number | '100%' | Width of the popup |
width | string | number | '100%' | Width of the input element |
gridSettings | GridSettingsModel | {rowHeight:null, gridLines:'Default', enableAltRow:false} | Popup grid appearance |
query | Query | null | Query for remote data |
htmlAttributes | { [key: string]: string } | {} | HTML attributes on the input |
locale | string | '' | Locale code (e.g. 'fr-BE') |
itemTemplate | string | Function | null | Custom row template |
groupTemplate | string | Function | null | Custom group header template |
footerTemplate | string | Function | null | Custom footer template |
noRecordsTemplate | string | Function | 'No records found' | Empty-state template |
actionFailureTemplate | string | Function | 'Request failed' | Remote error template |
FAQ
What does the syncfusion-javascript-dropdowns skill do?
Comprehensive guide for implementing Syncfusion TypeScript dropdown components including AutoComplete, ComboBox, Mention, Dropdownlist, Multiselect, ListBox, and MultiColumn ComboBox. Use this when building selection interfaces, data binding, filtering, cascading dropdowns, dual list transfer, custom templates, and accessible dropdown experiences.
How do I install syncfusion-javascript-dropdowns?
Run npx skills add https://github.com/syncfusion/javascript-ui-controls-skills --skill syncfusion-javascript-dropdowns in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/syncfusion-javascript-dropdowns/ (personal) or .claude/skills/syncfusion-javascript-dropdowns/ (project).
Which AI agents can use syncfusion-javascript-dropdowns?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is syncfusion-javascript-dropdowns safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains syncfusion-javascript-dropdowns?
It is published by syncfusion in syncfusion/javascript-ui-controls-skills. It has 72 recorded installs.
More from syncfusion/javascript-ui-controls-skills
syncfusion-javascript-grid
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
syncfusion-javascript-common
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
syncfusion-javascript-license
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
syncfusion-javascript-popups
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
syncfusion-javascript-tab
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
syncfusion-javascript-gantt-chart
syncfusion/javascript-ui-controls-skills
Open the skill to read its SKILL.md instructions.
Popular frontend & design skills
setup-matt-pocock-skills
mattpocock/skills
Configure this repo for the engineering skills: set up its issue tracker, triage label vocabulary, and domain doc layout. Run once before first use of the other engineering skills.
frontend-design
anthropics/skills
Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
hyperframes-animation
heygen-com/hyperframes
All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition's choreography (animation map) and 24 named text-animation effects. HyperFrames-native: single paused timeline, seek-safe, deterministic.
prototype
mattpocock/skills
Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.
hyperframes-core
heygen-com/hyperframes
The HyperFrames composition contract — build one renderable project. Use for composition structure, the data- timing attributes, class="clip", tracks, sub-compositions, variables, framework-owned media playback, deterministic-render rules, and validation. Read before writing composition HTML.
vercel-react-best-practices
vercel-labs/agent-skills
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.