Blame | Last modification | View Log | RSS feed
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.jsondataUrl += 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 itemvar 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 itemvalues[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 anyif(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);}});}