diff options
Diffstat (limited to 'includes/js/dojox/data/demos/stores')
| -rw-r--r-- | includes/js/dojox/data/demos/stores/LazyLoadJSIStore.js | 142 | 
1 files changed, 142 insertions, 0 deletions
diff --git a/includes/js/dojox/data/demos/stores/LazyLoadJSIStore.js b/includes/js/dojox/data/demos/stores/LazyLoadJSIStore.js new file mode 100644 index 0000000..e7acff7 --- /dev/null +++ b/includes/js/dojox/data/demos/stores/LazyLoadJSIStore.js @@ -0,0 +1,142 @@ +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); +	} +}); + + +}  | 
