Dojo ComboBox with JsonRest store and loading indicator.
I was using a JsonRest store to populate a dijit ComboBox and FilteringSelect with auto complete and needed to display a spinner or loading message while the JsonRest store was querying.
I googled around for a built in solution and found a couple people asking but no responses.
I am not sure if this is the best approach but a quick and easy enough solution for me was to intercept the functions that are called when a search begins and ends. These functions exist within dijit/form/_SearchMixin.js that the ComboBox and FilteringSelect inherit from:
_SearchMixin._startSearch -> Called when a search starts
_SearchMixin.onComplete -> Called when a search ends.
Therefore I did something similar to the following to display a loading indicator during store queries. The only down side to this approach is a missing edge case where if the JsonRest store has an error, the loading indicator will continue to display.
I googled around for a built in solution and found a couple people asking but no responses.
I am not sure if this is the best approach but a quick and easy enough solution for me was to intercept the functions that are called when a search begins and ends. These functions exist within dijit/form/_SearchMixin.js that the ComboBox and FilteringSelect inherit from:
_SearchMixin._startSearch -> Called when a search starts
_SearchMixin.onComplete -> Called when a search ends.
Therefore I did something similar to the following to display a loading indicator during store queries. The only down side to this approach is a missing edge case where if the JsonRest store has an error, the loading indicator will continue to display.
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dijit/themes/claro/claro.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js"></script>
<script>
require([
'dojo/aspect',
'dojo/store/Memory',
'dojo/dom-style',
'dijit/form/ComboBox',
'dojo/domReady!'
], function (aspect, Memory, domStyle, ComboBox) {
var someData = [
{ id:1, name:"One" },
{ id:2, name:"Two" }
];
var combobox = new ComboBox({
store: new Memory( {data: someData }),
searchAttr: 'name',
autocomplete: true
}, 'exampleCombobox');
function showSpinner() {
domStyle.set("exampleSpinner", "display", "block");
}
function hideSpinner() {
domStyle.set("exampleSpinner", "display", "none");
}
aspect.after(combobox, '_startSearch', showSpinner);
aspect.after(combobox, 'onSearch', hideSpinner);
});
</script>
</head>
<body class="claro">
<input id="exampleCombobox"/>
<img src="https://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dijit/themes/claro/images/loadingAnimation.gif"
style="display:none"
id="exampleSpinner"/>
</body>
</html>
Comments
Post a Comment