if(!dojo._hasResource["dojox.data.demos.stores.LazyLoadJSIStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. dojo._hasResource["dojox.data.demos.stores.LazyLoadJSIStore"] = true; dojo.provide("dojox.data.demos.stores.LazyLoadJSIStore"); dojo.require("dojo.data.ItemFileReadStore"); dojo.declare("dojox.data.demos.stores.LazyLoadJSIStore", dojo.data.ItemFileReadStore, { constructor: function(/* object */ keywordParameters){ // LazyLoadJSIStore extends ItemFileReadStore to implement an // example of lazy-loading/faulting in items on-demand. // Note this is certianly not a perfect implementation, it is // an example. }, isItemLoaded: function(/*object*/ item) { // summary: // Overload of the isItemLoaded function to look for items of type 'stub', which indicate // the data hasn't been loaded in yet. // // item: // The item to examine. //For this store, if it has the value of stub for its type attribute, //then the item basn't been fully loaded yet. It's just a placeholder. if(this.getValue(item, "type") === "stub"){ return false; } return true; }, loadItem: function(keywordArgs){ // summary: // Overload of the loadItem function to fault in items. This assumes the data for an item is laid out // in a RESTful sort of pattern name0/name1/data.json and so on and uses that to load the data. // It will also detect stub items in the newly loaded item and insert the stubs into the ItemFileReadStore // list so they can also be loaded in on-demand. // // item: // The item to examine. var item = keywordArgs.item; this._assertIsItem(item); //Build the path to the data.json for this item //The path consists of where its parent was loaded from //plus the item name. var itemName = this.getValue(item, "name"); var parent = this.getValue(item, "parent"); var dataUrl = ""; if (parent){ dataUrl += (parent + "/"); } //For this store, all child input data is loaded from a url that ends with data.json dataUrl += itemName + "/data.json"; //Need a reference to the store to call back to its structures. var self = this; // Callback for handling a successful load. var gotData = function(data){ //Now we need to modify the existing item a bit to take it out of stub state //Since we extend the store and have knowledge of the internal //structure, this can be done here. Now, is we extended //a write store, we could call the write APIs to do this too //But for a simple demo the diretc modification in the store function //is sufficient. //Clear off the stub indicators. delete item.type; delete item.parent; //Set up the loaded values in the format ItemFileReadStore uses for attributes. for (i in data) { if (dojo.isArray(data[i])) { item[i] = data[i]; }else{ item[i] = [data[i]]; } } //Reset the item in the reference. self._arrayOfAllItems[item[self._itemNumPropName]] = item; //Scan the new values in the item for extra stub items we need to //add to the items array of the store so they can be lazy-loaded later... var attributes = self.getAttributes(item); for(i in attributes){ var values = self.getValues(item, attributes[i]); for (var j = 0; j < values.length; j++) { var value = values[j]; if(typeof value === "object"){ if(value["stub"] ){ //We have a stub reference here, we need to create the stub item var stub = { type: ["stub"], name: [value["stub"]], // parent: [itemName] //The child stub item is parented by this item name... }; if (parent) { //Add in any parents to your parent so URL construstruction is accurate. stub.parent[0] = parent + "/" + stub.parent[0]; } //Finalize the addition of the new stub item into the ItemFileReadStore list. self._arrayOfAllItems.push(stub); stub[self._storeRefPropName] = self; stub[self._itemNumPropName] = (self._arrayOfAllItems.length - 1); //Last one pushed in should be the item values[j] = stub; //Set the stub item back in its place and replace the stub notation. } } } } //Done processing! Call the onItem, if any. if(keywordArgs.onItem){ var scope = keywordArgs.scope ? keywordArgs.scope : dojo.global; keywordArgs.onItem.call(scope, item); } }; //Callback for any errors that occur during load. var gotError = function(error){ //Call the onComplete, if any if(keywordArgs.onError){ var scope = keywordArgs.scope ? keywordArgs.scope : dojo.global; keywordArgs.onError.call(scope, error); } }; //Fire the get and pass the proper callbacks to the deferred. var xhrArgs = { url: dataUrl, handleAs: "json-comment-optional" }; var d = dojo.xhrGet(xhrArgs); d.addCallback(gotData); d.addErrback(gotError); } }); }