RemoteStore.js
资源名称:oa.rar [点击查看]
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:9k
源码类别:
OA系统
开发平台:
Java
- /*
- 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;
- }});