Skip to content

Commit be4d091

Browse files
committed
Working on remote data sets
This starts work on the example, which currently uses the GitHub API. The `ajax.delay` option has been added that allows for debouncing requests made within a certain number of milliseconds.
1 parent 6d2b462 commit be4d091

8 files changed

Lines changed: 144 additions & 47 deletions

File tree

dist/js/select2.amd.full.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,16 +1211,19 @@ define('select2/data/ajax',[
12111211
function AjaxAdapter ($element, options) {
12121212
this.ajaxOptions = options.get('ajax');
12131213

1214-
this.processResults = this.ajaxOptions.processResults ||
1215-
function (results) {
1216-
return results;
1217-
};
1214+
if (this.ajaxOptions.processResults != null) {
1215+
this.processResults = this.ajaxOptions.processResults;
1216+
}
12181217

12191218
ArrayAdapter.__super__.constructor.call(this, $element, options);
12201219
}
12211220

12221221
Utils.Extend(AjaxAdapter, ArrayAdapter);
12231222

1223+
AjaxAdapter.prototype.processResults = function (results) {
1224+
return results;
1225+
};
1226+
12241227
AjaxAdapter.prototype.query = function (params, callback) {
12251228
var matches = [];
12261229
var self = this;
@@ -1237,13 +1240,25 @@ define('select2/data/ajax',[
12371240
options.data = options.data(params);
12381241
}
12391242

1240-
var $request = $.ajax(options);
1243+
function request () {
1244+
var $request = $.ajax(options);
12411245

1242-
$request.success(function (data) {
1243-
var results = self.processResults(data);
1246+
$request.success(function (data) {
1247+
var results = self.processResults(data);
12441248

1245-
callback(results);
1246-
});
1249+
callback(results);
1250+
});
1251+
}
1252+
1253+
if (this.ajaxOptions.delay && params.term !== '') {
1254+
if (this._queryTimeout) {
1255+
window.clearTimeout(this._queryTimeout);
1256+
}
1257+
1258+
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
1259+
} else {
1260+
request();
1261+
}
12471262
};
12481263

12491264
return AjaxAdapter;

dist/js/select2.amd.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,16 +1211,19 @@ define('select2/data/ajax',[
12111211
function AjaxAdapter ($element, options) {
12121212
this.ajaxOptions = options.get('ajax');
12131213

1214-
this.processResults = this.ajaxOptions.processResults ||
1215-
function (results) {
1216-
return results;
1217-
};
1214+
if (this.ajaxOptions.processResults != null) {
1215+
this.processResults = this.ajaxOptions.processResults;
1216+
}
12181217

12191218
ArrayAdapter.__super__.constructor.call(this, $element, options);
12201219
}
12211220

12221221
Utils.Extend(AjaxAdapter, ArrayAdapter);
12231222

1223+
AjaxAdapter.prototype.processResults = function (results) {
1224+
return results;
1225+
};
1226+
12241227
AjaxAdapter.prototype.query = function (params, callback) {
12251228
var matches = [];
12261229
var self = this;
@@ -1237,13 +1240,25 @@ define('select2/data/ajax',[
12371240
options.data = options.data(params);
12381241
}
12391242

1240-
var $request = $.ajax(options);
1243+
function request () {
1244+
var $request = $.ajax(options);
12411245

1242-
$request.success(function (data) {
1243-
var results = self.processResults(data);
1246+
$request.success(function (data) {
1247+
var results = self.processResults(data);
12441248

1245-
callback(results);
1246-
});
1249+
callback(results);
1250+
});
1251+
}
1252+
1253+
if (this.ajaxOptions.delay && params.term !== '') {
1254+
if (this._queryTimeout) {
1255+
window.clearTimeout(this._queryTimeout);
1256+
}
1257+
1258+
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
1259+
} else {
1260+
request();
1261+
}
12471262
};
12481263

12491264
return AjaxAdapter;

dist/js/select2.full.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10746,16 +10746,19 @@ define('select2/data/ajax',[
1074610746
function AjaxAdapter ($element, options) {
1074710747
this.ajaxOptions = options.get('ajax');
1074810748

10749-
this.processResults = this.ajaxOptions.processResults ||
10750-
function (results) {
10751-
return results;
10752-
};
10749+
if (this.ajaxOptions.processResults != null) {
10750+
this.processResults = this.ajaxOptions.processResults;
10751+
}
1075310752

1075410753
ArrayAdapter.__super__.constructor.call(this, $element, options);
1075510754
}
1075610755

1075710756
Utils.Extend(AjaxAdapter, ArrayAdapter);
1075810757

10758+
AjaxAdapter.prototype.processResults = function (results) {
10759+
return results;
10760+
};
10761+
1075910762
AjaxAdapter.prototype.query = function (params, callback) {
1076010763
var matches = [];
1076110764
var self = this;
@@ -10772,13 +10775,25 @@ define('select2/data/ajax',[
1077210775
options.data = options.data(params);
1077310776
}
1077410777

10775-
var $request = $.ajax(options);
10778+
function request () {
10779+
var $request = $.ajax(options);
1077610780

10777-
$request.success(function (data) {
10778-
var results = self.processResults(data);
10781+
$request.success(function (data) {
10782+
var results = self.processResults(data);
1077910783

10780-
callback(results);
10781-
});
10784+
callback(results);
10785+
});
10786+
}
10787+
10788+
if (this.ajaxOptions.delay && params.term !== '') {
10789+
if (this._queryTimeout) {
10790+
window.clearTimeout(this._queryTimeout);
10791+
}
10792+
10793+
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
10794+
} else {
10795+
request();
10796+
}
1078210797
};
1078310798

1078410799
return AjaxAdapter;

dist/js/select2.full.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/js/select2.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,16 +1639,19 @@ define('select2/data/ajax',[
16391639
function AjaxAdapter ($element, options) {
16401640
this.ajaxOptions = options.get('ajax');
16411641

1642-
this.processResults = this.ajaxOptions.processResults ||
1643-
function (results) {
1644-
return results;
1645-
};
1642+
if (this.ajaxOptions.processResults != null) {
1643+
this.processResults = this.ajaxOptions.processResults;
1644+
}
16461645

16471646
ArrayAdapter.__super__.constructor.call(this, $element, options);
16481647
}
16491648

16501649
Utils.Extend(AjaxAdapter, ArrayAdapter);
16511650

1651+
AjaxAdapter.prototype.processResults = function (results) {
1652+
return results;
1653+
};
1654+
16521655
AjaxAdapter.prototype.query = function (params, callback) {
16531656
var matches = [];
16541657
var self = this;
@@ -1665,13 +1668,25 @@ define('select2/data/ajax',[
16651668
options.data = options.data(params);
16661669
}
16671670

1668-
var $request = $.ajax(options);
1671+
function request () {
1672+
var $request = $.ajax(options);
16691673

1670-
$request.success(function (data) {
1671-
var results = self.processResults(data);
1674+
$request.success(function (data) {
1675+
var results = self.processResults(data);
16721676

1673-
callback(results);
1674-
});
1677+
callback(results);
1678+
});
1679+
}
1680+
1681+
if (this.ajaxOptions.delay && params.term !== '') {
1682+
if (this._queryTimeout) {
1683+
window.clearTimeout(this._queryTimeout);
1684+
}
1685+
1686+
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
1687+
} else {
1688+
request();
1689+
}
16751690
};
16761691

16771692
return AjaxAdapter;

dist/js/select2.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/examples.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ <h2>Example code</h2>
418418

419419
var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }];
420420

421+
var $ajax = $(".js-example-data-ajax");
422+
421423
var $disabledResults = $(".js-example-disabled-results");
422424

423425
var $tags = $(".js-example-tags");
@@ -443,6 +445,26 @@ <h2>Example code</h2>
443445
data: data
444446
});
445447

448+
$ajax.select2({
449+
ajax: {
450+
url: "https://api.github.com/search/repositories",
451+
dataType: 'json',
452+
delay: 250,
453+
data: function (params) {
454+
return {
455+
q: params.term, // search term
456+
};
457+
},
458+
processResults: function (data, page) {
459+
// parse the results into the format expected by Select2.
460+
// since we are using custom formatting functions we do not need to
461+
// alter the remote JSON data
462+
return data.items;
463+
},
464+
cache: true
465+
}
466+
});
467+
446468
$disabledResults.select2();
447469

448470
$(".js-example-programmatic").select2();

src/js/select2/data/ajax.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ define([
66
function AjaxAdapter ($element, options) {
77
this.ajaxOptions = options.get('ajax');
88

9-
this.processResults = this.ajaxOptions.processResults ||
10-
function (results) {
11-
return results;
12-
};
9+
if (this.ajaxOptions.processResults != null) {
10+
this.processResults = this.ajaxOptions.processResults;
11+
}
1312

1413
ArrayAdapter.__super__.constructor.call(this, $element, options);
1514
}
1615

1716
Utils.Extend(AjaxAdapter, ArrayAdapter);
1817

18+
AjaxAdapter.prototype.processResults = function (results) {
19+
return results;
20+
};
21+
1922
AjaxAdapter.prototype.query = function (params, callback) {
2023
var matches = [];
2124
var self = this;
@@ -32,13 +35,25 @@ define([
3235
options.data = options.data(params);
3336
}
3437

35-
var $request = $.ajax(options);
38+
function request () {
39+
var $request = $.ajax(options);
3640

37-
$request.success(function (data) {
38-
var results = self.processResults(data);
41+
$request.success(function (data) {
42+
var results = self.processResults(data);
3943

40-
callback(results);
41-
});
44+
callback(results);
45+
});
46+
}
47+
48+
if (this.ajaxOptions.delay && params.term !== '') {
49+
if (this._queryTimeout) {
50+
window.clearTimeout(this._queryTimeout);
51+
}
52+
53+
this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
54+
} else {
55+
request();
56+
}
4257
};
4358

4459
return AjaxAdapter;

0 commit comments

Comments
 (0)