⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itemfilereadstore.js

📁 这是一个ajax的例子大家好好的看看就是一个鱼眼的效果
💻 JS
📖 第 1 页 / 共 2 页
字号:
			// 	|	false == valueIsAnItem({_reference:'Kermit'});			// 	|	true == valueIsAnItem({name:'Kermit', color:'green'});			// 	|	true == valueIsAnItem({iggy:'pop'});			// 	|	true == valueIsAnItem({foo:42});			var isItem = (				(aValue != null) &&				(typeof aValue == "object") &&				(!dojo.isArray(aValue)) &&				(!dojo.isFunction(aValue)) &&				(aValue.constructor == Object) &&				(typeof aValue._reference == "undefined") && 				(typeof aValue._type == "undefined") && 				(typeof aValue._value == "undefined")			);			return isItem;		}				var self = this;		function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){			self._arrayOfAllItems.push(anItem);			for(var attribute in anItem){				var valueForAttribute = anItem[attribute];				if(valueForAttribute){					if(dojo.isArray(valueForAttribute)){						var valueArray = valueForAttribute;						for(var k = 0; k < valueArray.length; ++k){							var singleValue = valueArray[k];							if(valueIsAnItem(singleValue)){								addItemAndSubItemsToArrayOfAllItems(singleValue);							}						}					}else{						if(valueIsAnItem(valueForAttribute)){							addItemAndSubItemsToArrayOfAllItems(valueForAttribute);						}					}				}			}		}		this._labelAttr = dataObject.label;		// We need to do some transformations to convert the data structure		// that we read from the file into a format that will be convenient		// to work with in memory.		// Step 1: Walk through the object hierarchy and build a list of all items		var i;		var item;		this._arrayOfAllItems = [];		this._arrayOfTopLevelItems = dataObject.items;		for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){			item = this._arrayOfTopLevelItems[i];			addItemAndSubItemsToArrayOfAllItems(item);			item[this._rootItemPropName]=true;		}		// Step 2: Walk through all the attribute values of all the items, 		// and replace single values with arrays.  For example, we change this:		//		{ name:'Miss Piggy', pets:'Foo-Foo'}		// into this:		//		{ name:['Miss Piggy'], pets:['Foo-Foo']}		// 		// We also store the attribute names so we can validate our store  		// reference and item id special properties for the O(1) isItem		var allAttributeNames = {};		var key;		for(i = 0; i < this._arrayOfAllItems.length; ++i){			item = this._arrayOfAllItems[i];			for(key in item){				if (key !== this._rootItemPropName)				{					var value = item[key];					if(value !== null){						if(!dojo.isArray(value)){							item[key] = [value];						}					}else{						item[key] = [null];					}				}				allAttributeNames[key]=key;			}		}		// Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName		// This should go really fast, it will generally never even run the loop.		while(allAttributeNames[this._storeRefPropName]){			this._storeRefPropName += "_";		}		while(allAttributeNames[this._itemNumPropName]){			this._itemNumPropName += "_";		}		while(allAttributeNames[this._reverseRefMap]){			this._reverseRefMap += "_";		}		// Step 4: Some data files specify an optional 'identifier', which is 		// the name of an attribute that holds the identity of each item. 		// If this data file specified an identifier attribute, then build a 		// hash table of items keyed by the identity of the items.		var arrayOfValues;		var identifier = dataObject.identifier;		if(identifier){			this._itemsByIdentity = {};			this._features['dojo.data.api.Identity'] = identifier;			for(i = 0; i < this._arrayOfAllItems.length; ++i){				item = this._arrayOfAllItems[i];				arrayOfValues = item[identifier];				var identity = arrayOfValues[0];				if(!this._itemsByIdentity[identity]){					this._itemsByIdentity[identity] = item;				}else{					if(this._jsonFileUrl){						throw new Error("dojo.data.ItemFileReadStore:  The json data as specified by: [" + this._jsonFileUrl + "] is malformed.  Items within the list have identifier: [" + identifier + "].  Value collided: [" + identity + "]");					}else if(this._jsonData){						throw new Error("dojo.data.ItemFileReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: [" + identifier + "].  Value collided: [" + identity + "]");					}				}			}		}else{			this._features['dojo.data.api.Identity'] = Number;		}		// Step 5: Walk through all the items, and set each item's properties 		// for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true.		for(i = 0; i < this._arrayOfAllItems.length; ++i){			item = this._arrayOfAllItems[i];			item[this._storeRefPropName] = this;			item[this._itemNumPropName] = i;		}		// Step 6: We walk through all the attribute values of all the items,		// looking for type/value literals and item-references.		//		// We replace item-references with pointers to items.  For example, we change:		//		{ name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }		// into this:		//		{ name:['Kermit'], friends:[miss_piggy] } 		// (where miss_piggy is the object representing the 'Miss Piggy' item).		//		// We replace type/value pairs with typed-literals.  For example, we change:		//		{ name:['Nelson Mandela'], born:[{_type:'Date', _value:'July 18, 1918'}] }		// into this:		//		{ name:['Kermit'], born:(new Date('July 18, 1918')) } 		//		// We also generate the associate map for all items for the O(1) isItem function.		for(i = 0; i < this._arrayOfAllItems.length; ++i){			item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }			for(key in item){				arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}]				for(var j = 0; j < arrayOfValues.length; ++j) {					value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}}					if(value !== null && typeof value == "object"){						if(value._type && value._value){							var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber'							var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}}							if(!mappingObj){ 								throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'");							}else if(dojo.isFunction(mappingObj)){								arrayOfValues[j] = new mappingObj(value._value);							}else if(dojo.isFunction(mappingObj.deserialize)){								arrayOfValues[j] = mappingObj.deserialize(value._value);							}else{								throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");							}						}						if(value._reference){							var referenceDescription = value._reference; // example: {name:'Miss Piggy'}							if(!dojo.isObject(referenceDescription)){								// example: 'Miss Piggy'								// from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]}								arrayOfValues[j] = this._itemsByIdentity[referenceDescription];							}else{								// example: {name:'Miss Piggy'}								// from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] }								for(var k = 0; k < this._arrayOfAllItems.length; ++k){									var candidateItem = this._arrayOfAllItems[k];									var found = true;									for(var refKey in referenceDescription){										if(candidateItem[refKey] != referenceDescription[refKey]){ 											found = false; 										}									}									if(found){ 										arrayOfValues[j] = candidateItem; 									}								}							}							if(this.referenceIntegrity){								var refItem = arrayOfValues[j];								if(this.isItem(refItem)){									this._addReferenceToMap(refItem, item, key);								}							}						}else if(this.isItem(value)){							//It's a child item (not one referenced through _reference).  							//We need to treat this as a referenced item, so it can be cleaned up							//in a write store easily.							if(this.referenceIntegrity){								this._addReferenceToMap(value, item, key);							}						}					}				}			}		}	},	_addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){		 //	summary:		 //		Method to add an reference map entry for an item and attribute.		 //	description:		 //		Method to add an reference map entry for an item and attribute. 		 //		 //	refItem:		 //		The item that is referenced.		 //	parentItem:		 //		The item that holds the new reference to refItem.		 //	attribute:		 //		The attribute on parentItem that contains the new reference.		 		 //Stub function, does nothing.  Real processing is in ItemFileWriteStore.	},	getIdentity: function(/* item */ item){		//	summary: 		//		See dojo.data.api.Identity.getIdentity()		var identifier = this._features['dojo.data.api.Identity'];		if(identifier === Number){			return item[this._itemNumPropName]; // Number		}else{			var arrayOfValues = item[identifier];			if(arrayOfValues){				return arrayOfValues[0]; // Object || String			}		}		return null; // null	},	fetchItemByIdentity: function(/* Object */ keywordArgs){		//	summary: 		//		See dojo.data.api.Identity.fetchItemByIdentity()		// Hasn't loaded yet, we have to trigger the load.		if(!this._loadFinished){			var self = this;			if(this._jsonFileUrl){				if(this._loadInProgress){					this._queuedFetches.push({args: keywordArgs});				}else{					this._loadInProgress = true;					var getArgs = {							url: self._jsonFileUrl, 							handleAs: "json-comment-optional"					};					var getHandler = dojo.xhrGet(getArgs);					getHandler.addCallback(function(data){						var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;						try{							self._getItemsFromLoadedData(data);							self._loadFinished = true;							self._loadInProgress = false;							var item = self._getItemByIdentity(keywordArgs.identity);							if(keywordArgs.onItem){								keywordArgs.onItem.call(scope, item);							}							self._handleQueuedFetches();						}catch(error){							self._loadInProgress = false;							if(keywordArgs.onError){								keywordArgs.onError.call(scope, error);							}						}					});					getHandler.addErrback(function(error){						self._loadInProgress = false;						if(keywordArgs.onError){							var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;							keywordArgs.onError.call(scope, error);						}					});				}			}else if(this._jsonData){				// Passed in data, no need to xhr.				self._getItemsFromLoadedData(self._jsonData);				self._jsonData = null;				self._loadFinished = true;				var item = self._getItemByIdentity(keywordArgs.identity);				if(keywordArgs.onItem){					var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;					keywordArgs.onItem.call(scope, item);				}			} 		}else{			// Already loaded.  We can just look it up and call back.			var item = this._getItemByIdentity(keywordArgs.identity);			if(keywordArgs.onItem){				var scope =  keywordArgs.scope?keywordArgs.scope:dojo.global;				keywordArgs.onItem.call(scope, item);			}		}	},	_getItemByIdentity: function(/* Object */ identity){		//	summary:		//		Internal function to look an item up by its identity map.		var item = null;		if(this._itemsByIdentity){			item = this._itemsByIdentity[identity];		}else{			item = this._arrayOfAllItems[identity];		}		if(item === undefined){			item = null;		}		return item; // Object	},	getIdentityAttributes: function(/* item */ item){		//	summary: 		//		See dojo.data.api.Identity.getIdentifierAttributes()		 		var identifier = this._features['dojo.data.api.Identity'];		if(identifier === Number){			// If (identifier === Number) it means getIdentity() just returns			// an integer item-number for each item.  The dojo.data.api.Identity			// spec says we need to return null if the identity is not composed 			// of attributes 			return null; // null		}else{			return [identifier]; // Array		}	},		_forceLoad: function(){		//	summary: 		//		Internal function to force a load of the store if it hasn't occurred yet.  This is required		//		for specific functions to work properly.  		var self = this;		if(this._jsonFileUrl){				var getArgs = {					url: self._jsonFileUrl, 					handleAs: "json-comment-optional",					sync: true				};			var getHandler = dojo.xhrGet(getArgs);			getHandler.addCallback(function(data){				try{					//Check to be sure there wasn't another load going on concurrently 					//So we don't clobber data that comes in on it.  If there is a load going on					//then do not save this data.  It will potentially clobber current data.					//We mainly wanted to sync/wait here.					//TODO:  Revisit the loading scheme of this store to improve multi-initial					//request handling.					if (self._loadInProgress !== true && !self._loadFinished) {						self._getItemsFromLoadedData(data);						self._loadFinished = true;					}				}catch(e){					console.log(e);					throw e;				}			});			getHandler.addErrback(function(error){				throw error;			});		}else if(this._jsonData){			self._getItemsFromLoadedData(self._jsonData);			self._jsonData = null;			self._loadFinished = true;		} 	}});//Mix in the simple fetch implementation to this class.dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -