Setting the data source of a grid is generally very straightforward when using one of the provided view or Json rest services, but it doesn’t work the same way for a custom REST service. In this post, I’ll show how to get it to work.
Dojo Data Grid Series
Dojo Grids in XPages — All Blog Posts
Error Binding to a Custom REST Service
Normally, you add a REST service to the page to provide data and select it in the storeComponentId of the grid (as shown in ), but it throws an error when you do this with a custom REST service. (I tried binding the REST service to the grid based on both the id and jsId properties of the custom REST service, but the result was the same.)
The grid would not display on the page and Firebug would show this error:
ReferenceError: restService1 is not defined
Solution
In order to find a solution, I did some digging into what a pure dojo grid needs (outside of XPages) for a JSON data store.
Key points in the solution:
- Include two dojo modules in the page resources to set up the data store
- A pass-thru
script
tag with code to set up a JSON data store for the grid (uses the dojo modules that the resources specify) - The grid’s
store
property is set to the variable set up for the data source in the tag. (storeComponentId
needs an XPages component name.)
Below is the entire source of an XPage that demonstrates this technique.
Lines 05-08 include two dojo modules that you need in order to set up the data source.
Lines 10-46 define a custom REST service. The pathInfo
value in line 10 will be used to read the data. The majority of this is hard-coded data, which you would replace with your code to provide data for the grid.
Lines 48-53 are a standard client-side script
tag that set up the data store and make it available for the grid. The jsonStore
object reads the REST service data via URL path, so it needs the XPage name and the pathInfo
value for the REST service. Modify this line as needed to point to the page and REST service.
Lines 55-58 define the grid, but the key is that line 55 sets the store
property to the name of the JavaScript object defined in line 52.
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex"> <xp:this.resources> <xp:dojoModule name="dojo.store.JsonRest"></xp:dojoModule> <xp:dojoModule name="dojo.data.ObjectStore"></xp:dojoModule> </xp:this.resources> <xe:restService id="restService1" pathInfo="gridData"> <xe:this.service> <xe:customRestService contentType="application/json" requestVar="customData2" requestContentType="application/json"> <xe:this.doGet><![CDATA[#{javascript:// Create hard-coded test data var jsonData = []; var thisEntry = {}; thisEntry.Status = 'Open'; thisEntry.Name = 'John'; jsonData.push(thisEntry); thisEntry = {}; thisEntry.Status = 'Closed'; thisEntry.Name = 'Bill'; jsonData.push(thisEntry); thisEntry = {}; thisEntry.Status = 'Closed'; thisEntry.Name = 'Mike'; jsonData.push(thisEntry); thisEntry = {}; thisEntry.Status = 'Open'; thisEntry.Name = 'Jim'; jsonData.push(thisEntry); thisEntry = {}; thisEntry.Status = 'Open'; thisEntry.Name = 'Steve'; jsonData.push(thisEntry); return toJson(jsonData);}]]> </xe:this.doGet> </xe:customRestService> </xe:this.service> </xe:restService> <script> var jsonStore = new dojo.store.JsonRest( {target:"CURRENT_PAGE_NAME_HERE.xsp/gridData"} ); var dataStore = dojo.data.ObjectStore({objectStore: jsonStore}); </script> <xe:djxDataGrid id="djxDataGrid1" store="dataStore"> <xe:djxDataGridColumn id="djxDataGridColumn2" field="Name"></xe:djxDataGridColumn> <xe:djxDataGridColumn id="djxDataGridColumn1" field="Status"></xe:djxDataGridColumn> </xe:djxDataGrid> </xp:view>
