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

📄 remotestore.js

📁 初学者
💻 JS
字号:
/*	Copyright (c) 2004-2006, The Dojo Foundation	All Rights Reserved.	Licensed under the Academic Free License version 2.1 or above OR the	modified BSD license. For more information on Dojo licensing, see:		http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.data.core.RemoteStore");dojo.require("dojo.data.core.Read");dojo.require("dojo.data.core.Write");dojo.require("dojo.data.core.Result");dojo.require("dojo.experimental");dojo.require("dojo.Deferred");dojo.require("dojo.lang.declare");dojo.require("dojo.json");dojo.require("dojo.io.*");dojo.experimental("dojo.data.core.RemoteStore");dojo.lang.declare("dojo.data.core.RemoteStore", [dojo.data.core.Read, dojo.data.core.Write], {_datatypeMap:{}, _jsonRegistry:dojo.json.jsonRegistry, initializer:function (kwArgs) {	if (!kwArgs) {		kwArgs = {};	}	this._serverQueryUrl = kwArgs.queryUrl || "";	this._serverSaveUrl = kwArgs.saveUrl || "";	this._deleted = {};	this._changed = {};	this._added = {};	this._results = {};	this._data = {};	this._numItems = 0;}, _setupQueryRequest:function (result, requestKw) {	result.query = result.query || "";	requestKw.url = this._serverQueryUrl + encodeURIComponent(result.query);	requestKw.method = "get";	requestKw.mimetype = "text/json";}, _resultToQueryMetadata:function (serverResponseData) {	return serverResponseData;}, _resultToQueryData:function (serverResponseData) {	return serverResponseData.data;}, _remoteToLocalValues:function (attributes) {	for (var key in attributes) {		var values = attributes[key];		for (var i = 0; i < values.length; i++) {			var value = values[i];			var type = value.datatype || value.type;			if (type) {				var localValue = value.value;				if (this._datatypeMap[type]) {					localValue = this._datatypeMap[type](value);				}				values[i] = localValue;			}		}	}	return attributes;}, _queryToQueryKey:function (query) {	if (typeof query == "string") {		return query;	} else {		return dojo.json.serialize(query);	}}, _assertIsItem:function (item) {	if (!this.isItem(item)) {		throw new Error("dojo.data.RemoteStore: a function was passed an item argument that was not an item");	}}, get:function (item, attribute, defaultValue) {	var valueArray = this.getValues(item, attribute);	if (valueArray.length == 0) {		return defaultValue;	}	return valueArray[0];}, getValues:function (item, attribute) {	var itemIdentity = this.getIdentity(item);	this._assertIsItem(itemIdentity);	var changes = this._changed[itemIdentity];	if (changes) {		var newvalues = changes[attribute];		if (newvalues !== undefined) {			return newvalues;		} else {			return [];		}	}	return this._data[itemIdentity][0][attribute];}, getAttributes:function (item) {	var itemIdentity = this.getIdentity(item);	if (!itemIdentity) {		return undefined;	}	var atts = [];	var attrDict = this._data[itemIdentity][0];	for (var att in attrDict) {		atts.push(att);	}	return atts;}, hasAttribute:function (item, attribute) {	var valueArray = this.getValues(item, attribute);	return valueArray.length ? true : false;}, containsValue:function (item, attribute, value) {	var valueArray = this.getValues(item, attribute);	for (var i = 0; i < valueArray.length; i++) {		if (valueArray[i] == value) {			return true;		}	}	return false;}, isItem:function (something) {	if (!something) {		return false;	}	var itemIdentity = something;	if (this._deleted[itemIdentity]) {		return false;	}	if (this._data[itemIdentity]) {		return true;	}	if (this._added[itemIdentity]) {		return true;	}	return false;}, find:function (keywordArgs) {	var result = null;	if (keywordArgs instanceof dojo.data.core.Result) {		result = keywordArgs;		result.store = this;	} else {		result = new dojo.data.core.Result(keywordArgs, this);	}	var query = result.query;	var self = this;	var bindfunc = function (type, data, evt) {		var scope = result.scope || dj_global;		if (type == "load") {			result.resultMetadata = self._resultToQueryMetadata(data);			var dataDict = self._resultToQueryData(data);			if (result.onbegin) {				result.onbegin.call(scope, result);			}			var count = 0;			var resultData = [];			var newItemCount = 0;			for (var key in dataDict) {				if (result._aborted) {					break;				}				if (!self._deleted[key]) {					var values = dataDict[key];					var attributeDict = self._remoteToLocalValues(values);					var existingValue = self._data[key];					var refCount = 1;					if (existingValue) {						refCount = ++existingValue[1];					} else {						newItemCount++;					}					self._data[key] = [attributeDict, refCount];					resultData.push(key);					count++;					if (result.onnext) {						result.onnext.call(scope, key, result);					}				}			}			self._results[self._queryToQueryKey(query)] = resultData;			self._numItems += newItemCount;			result.length = count;			if (result.saveResult) {				result.items = resultData;			}			if (!result._aborted && result.oncompleted) {				result.oncompleted.call(scope, result);			}		} else {			if (type == "error" || type == "timeout") {				dojo.debug("find error: " + dojo.json.serialize(data));				if (result.onerror) {					result.onerror.call(scope, data);				}			}		}	};	var bindKw = keywordArgs.bindArgs || {};	bindKw.sync = result.sync;	bindKw.handle = bindfunc;	this._setupQueryRequest(result, bindKw);	var request = dojo.io.bind(bindKw);	result._abortFunc = request.abort;	return result;}, getIdentity:function (item) {	if (!this.isItem(item)) {		return null;	}	return (item.id ? item.id : item);}, newItem:function (attributes, keywordArgs) {	var itemIdentity = keywordArgs["identity"];	if (this._deleted[itemIdentity]) {		delete this._deleted[itemIdentity];	} else {		this._added[itemIdentity] = 1;	}	if (attributes) {		for (var attribute in attributes) {			var valueOrArrayOfValues = attributes[attribute];			if (dojo.lang.isArray(valueOrArrayOfValues)) {				this.setValues(itemIdentity, attribute, valueOrArrayOfValues);			} else {				this.set(itemIdentity, attribute, valueOrArrayOfValues);			}		}	}	return {id:itemIdentity};}, deleteItem:function (item) {	var identity = this.getIdentity(item);	if (!identity) {		return false;	}	if (this._added[identity]) {		delete this._added[identity];	} else {		this._deleted[identity] = 1;	}	if (this._changed[identity]) {		delete this._changed[identity];	}	return true;}, setValues:function (item, attribute, values) {	var identity = this.getIdentity(item);	if (!identity) {		return undefined;	}	var changes = this._changed[identity];	if (!changes) {		changes = {};		this._changed[identity] = changes;	}	changes[attribute] = values;	return true;}, set:function (item, attribute, value) {	return this.setValues(item, attribute, [value]);}, unsetAttribute:function (item, attribute) {	return this.setValues(item, attribute, []);}, _initChanges:function () {	this._deleted = {};	this._changed = {};	this._added = {};}, _setupSaveRequest:function (saveKeywordArgs, requestKw) {	requestKw.url = this._serverSaveUrl;	requestKw.method = "post";	requestKw.mimetype = "text/plain";	var deleted = [];	for (var key in this._deleted) {		deleted.push(key);	}	var saveStruct = {"changed":this._changed, "deleted":deleted};	var oldRegistry = dojo.json.jsonRegistry;	dojo.json.jsonRegistry = this._jsonRegistry;	var jsonString = dojo.json.serialize(saveStruct);	dojo.json.jsonRegistry = oldRegistry;	requestKw.postContent = jsonString;}, save:function (keywordArgs) {	keywordArgs = keywordArgs || {};	var result = new dojo.Deferred();	var self = this;	var bindfunc = function (type, data, evt) {		if (type == "load") {			if (result.fired == 1) {				return;			}			var key = null;			for (key in self._added) {				if (!self._data[key]) {					self._data[key] = [{}, 1];				}			}			for (key in self._changed) {				var existing = self._data[key];				var changes = self._changed[key];				if (existing) {					existing[0] = changes;				} else {					self._data[key] = [changes, 1];				}			}			for (key in self._deleted) {				if (self._data[key]) {					delete self._data[key];				}			}			self._initChanges();			result.callback(true);		} else {			if (type == "error" || type == "timeout") {				result.errback(data);			}		}	};	var bindKw = {sync:keywordArgs["sync"], handle:bindfunc};	this._setupSaveRequest(keywordArgs, bindKw);	var request = dojo.io.bind(bindKw);	result.canceller = function (deferred) {		request.abort();	};	return result;}, revert:function () {	this._initChanges();	return true;}, isDirty:function (item) {	if (item) {		var identity = item.id || item;		return this._deleted[identity] || this._changed[identity];	} else {		var key = null;		for (key in this._changed) {			return true;		}		for (key in this._deleted) {			return true;		}		for (key in this._added) {			return true;		}		return false;	}}, createReference:function (idstring) {	return {id:idstring};}, getSize:function () {	return this._numItems;}, forgetResults:function (query) {	var queryKey = this._queryToQueryKey(query);	var results = this._results[queryKey];	if (!results) {		return false;	}	var removed = 0;	for (var i = 0; i < results.length; i++) {		var key = results[i];		var existingValue = this._data[key];		if (existingValue[1] <= 1) {			delete this._data[key];			removed++;		} else {			existingValue[1] = --existingValue[1];		}	}	delete this._results[queryKey];	this._numItems -= removed;	return true;}});

⌨️ 快捷键说明

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