123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- 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);
- }
- });
- }
|