New file |
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); |
} |
}); |
|
|
} |