As of dgrid 1.1.0, the mixin from this tutorial is now available as
dgrid/extensions/SingleQuery, including additional features such as
loadingMessage and noDataMessage support.
The Using Grids and Stores
Tutorial discussed dgrid's OnDemandList and
Pagination components, which read data from
dstore stores. OnDemandList
fetches pages of data as the user scrolls, and Pagination
displays one page of data at a time.
However, there are cases where you might not want paging functionality.
For example, perhaps you have a small in-memory store, and are
interested in re-styling the grid so that its height is determined
by the store's full contents. In this case, the scroll-based rendering
of OnDemandList would be irrelevant, and the paging
style of Pagination would be undesirable.
For such cases, it is trivial to create a mixin which issues a single range-less query to the store and renders the results all at once.
Note: This mixin should only be used with limited sets of data, preferably from in-memory stores, in order to maintain reasonable performance.
Let's create a mixin that extends the refresh method to perform a
range-less query:
define([
'dojo/_base/declare',
'dgrid/_StoreMixin'
], function (declare, _StoreMixin) {
return declare(_StoreMixin, {
// summary:
// dgrid mixin which implements the refresh method to
// always perform a single query with no start or count
// specified, to retrieve all relevant results at once.
// Appropriate for grids using memory stores with small
// result set sizes.
refresh: function () {
var self = this;
// First defer to List#refresh to clear the grid's
// previous content
this.inherited(arguments);
if (!this._renderedCollection) {
return;
}
return this._trackError(function () {
var queryResults = self._renderedCollection.fetch();
queryResults.totalLength.then(function (total) {
// Record total so it can be retrieved later via get('total')
self._total = total;
});
return self.renderQueryResults(queryResults);
});
},
renderArray: function () {
var rows = this.inherited(arguments);
// Clear _lastCollection which is ordinarily only used for
// store-less grids
this._lastCollection = null;
return rows;
}
});
});
View Demo
You can double-click the mixin code above to select all of it for easy copying.
The code above overrides List#refresh to call
_StoreMixin#renderQueryResults, which handles fetching and
rendering the data. Filtering and sort still work as expected, as seen in
the demo. This is thanks to the _setCollection and
_applySort methods defined in _StoreMixin, which
this mixin inherits. OnDemandList and Pagination
also inherit _StoreMixin, and it is intended to serve as a
baseline for any customized logic involving store interaction.
Another _StoreMixin feature used above is the
_trackError method, which can be used to wrap store calls.
Errors which occur in calls wrapped by _trackError are emitted
via dgrid-error events, making it possible to react to problems
which occur as a result of operations initiated by dgrid.
As mentioned earlier, one particularly useful scenario for this
type of mixin is when there is a desire to show all of the data
at once, where the grid's height is determined by its contents.
This can be accomplished simply by adding the
dgrid-autoheight class to an instance:
var grid = new (declare([ Grid, SingleQuery ]))({
className: 'dgrid-autoheight',
...
});
View Demo
The above examples should provide a good starting point for use cases which involve rendering the entirety of a store's data at once. While this isn't appropriate in every application, the situation presents itself often enough that it makes sense to standardize this pattern.
OnDemandList and OnDemandGrid
(includes documentation for _StoreMixin)Examples provided under dgrid's dual license.
Copyright OpenJS Foundation and dgrid contributors. All rights reserved. The OpenJS Foundation has registered trademarks and uses trademarks. For a list of trademarks of the OpenJS Foundation, please see our Trademark Policy and Trademark List. Trademarks and logos not indicated on the list of OpenJS Foundation trademarks are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
The OpenJS Foundation | Terms of Use | Privacy Policy | Bylaws | Code of Conduct | Trademark Policy | Trademark List | Cookie Policy