data-foundation-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:156k
源码类别:

中间件编程

开发平台:

JavaScript

  1.      */
  2.     destroy: function(){
  3.         this.purgeListeners();
  4.     }
  5. });
  6. /**
  7.  * @class Ext.data.DataProxy.Error
  8.  * @extends Ext.Error
  9.  * DataProxy Error extension.
  10.  * constructor
  11.  * @param {String} name
  12.  * @param {Record/Array[Record]/Array}
  13.  */
  14. Ext.data.DataProxy.Error = Ext.extend(Ext.Error, {
  15.     constructor : function(message, arg) {
  16.         this.arg = arg;
  17.         Ext.Error.call(this, message);
  18.     },
  19.     name: 'Ext.data.DataProxy'
  20. });
  21. Ext.apply(Ext.data.DataProxy.Error.prototype, {
  22.     lang: {
  23.         'action-undefined': "DataProxy attempted to execute an API-action but found an undefined url / function.  Please review your Proxy url/api-configuration.",
  24.         'api-invalid': 'Recieved an invalid API-configuration.  Please ensure your proxy API-configuration contains only the actions from Ext.data.Api.actions.'
  25.     }
  26. });
  27. /**
  28.  * @class Ext.data.ScriptTagProxy
  29.  * @extends Ext.data.DataProxy
  30.  * An implementation of Ext.data.DataProxy that reads a data object from a URL which may be in a domain
  31.  * other than the originating domain of the running page.<br>
  32.  * <p>
  33.  * <b>Note that if you are retrieving data from a page that is in a domain that is NOT the same as the originating domain
  34.  * of the running page, you must use this class, rather than HttpProxy.</b><br>
  35.  * <p>
  36.  * The content passed back from a server resource requested by a ScriptTagProxy <b>must</b> be executable JavaScript
  37.  * source code because it is used as the source inside a &lt;script> tag.<br>
  38.  * <p>
  39.  * In order for the browser to process the returned data, the server must wrap the data object
  40.  * with a call to a callback function, the name of which is passed as a parameter by the ScriptTagProxy.
  41.  * Below is a Java example for a servlet which returns data for either a ScriptTagProxy, or an HttpProxy
  42.  * depending on whether the callback name was passed:
  43.  * <p>
  44.  * <pre><code>
  45. boolean scriptTag = false;
  46. String cb = request.getParameter("callback");
  47. if (cb != null) {
  48.     scriptTag = true;
  49.     response.setContentType("text/javascript");
  50. } else {
  51.     response.setContentType("application/x-json");
  52. }
  53. Writer out = response.getWriter();
  54. if (scriptTag) {
  55.     out.write(cb + "(");
  56. }
  57. out.print(dataBlock.toJsonString());
  58. if (scriptTag) {
  59.     out.write(");");
  60. }
  61. </code></pre>
  62.  *
  63.  * @constructor
  64.  * @param {Object} config A configuration object.
  65.  */
  66. Ext.data.ScriptTagProxy = function(config){
  67.     Ext.apply(this, config);
  68.     Ext.data.ScriptTagProxy.superclass.constructor.call(this, config);
  69.     this.head = document.getElementsByTagName("head")[0];
  70.     /**
  71.      * @event loadexception
  72.      * <b>Deprecated</b> in favor of 'exception' event.
  73.      * Fires if an exception occurs in the Proxy during data loading.  This event can be fired for one of two reasons:
  74.      * <ul><li><b>The load call timed out.</b>  This means the load callback did not execute within the time limit
  75.      * specified by {@link #timeout}.  In this case, this event will be raised and the
  76.      * fourth parameter (read error) will be null.</li>
  77.      * <li><b>The load succeeded but the reader could not read the response.</b>  This means the server returned
  78.      * data, but the configured Reader threw an error while reading the data.  In this case, this event will be
  79.      * raised and the caught error will be passed along as the fourth parameter of this event.</li></ul>
  80.      * Note that this event is also relayed through {@link Ext.data.Store}, so you can listen for it directly
  81.      * on any Store instance.
  82.      * @param {Object} this
  83.      * @param {Object} options The loading options that were specified (see {@link #load} for details).  If the load
  84.      * call timed out, this parameter will be null.
  85.      * @param {Object} arg The callback's arg object passed to the {@link #load} function
  86.      * @param {Error} e The JavaScript Error object caught if the configured Reader could not read the data.
  87.      * If the remote request returns success: false, this parameter will be null.
  88.      */
  89. };
  90. Ext.data.ScriptTagProxy.TRANS_ID = 1000;
  91. Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {
  92.     /**
  93.      * @cfg {String} url The URL from which to request the data object.
  94.      */
  95.     /**
  96.      * @cfg {Number} timeout (optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.
  97.      */
  98.     timeout : 30000,
  99.     /**
  100.      * @cfg {String} callbackParam (Optional) The name of the parameter to pass to the server which tells
  101.      * the server the name of the callback function set up by the load call to process the returned data object.
  102.      * Defaults to "callback".<p>The server-side processing must read this parameter value, and generate
  103.      * javascript output which calls this named function passing the data object as its only parameter.
  104.      */
  105.     callbackParam : "callback",
  106.     /**
  107.      *  @cfg {Boolean} nocache (optional) Defaults to true. Disable caching by adding a unique parameter
  108.      * name to the request.
  109.      */
  110.     nocache : true,
  111.     /**
  112.      * HttpProxy implementation of DataProxy#doRequest
  113.      * @param {String} action
  114.      * @param {Ext.data.Record/Ext.data.Record[]} rs If action is <tt>read</tt>, rs will be null
  115.      * @param {Object} params An object containing properties which are to be used as HTTP parameters
  116.      * for the request to the remote server.
  117.      * @param {Ext.data.DataReader} reader The Reader object which converts the data
  118.      * object into a block of Ext.data.Records.
  119.      * @param {Function} callback The function into which to pass the block of Ext.data.Records.
  120.      * The function must be passed <ul>
  121.      * <li>The Record block object</li>
  122.      * <li>The "arg" argument from the load function</li>
  123.      * <li>A boolean success indicator</li>
  124.      * </ul>
  125.      * @param {Object} scope The scope in which to call the callback
  126.      * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
  127.      */
  128.     doRequest : function(action, rs, params, reader, callback, scope, arg) {
  129.         var p = Ext.urlEncode(Ext.apply(params, this.extraParams));
  130.         var url = this.buildUrl(action, rs);
  131.         if (!url) {
  132.             throw new Ext.data.Api.Error('invalid-url', url);
  133.         }
  134.         url = Ext.urlAppend(url, p);
  135.         if(this.nocache){
  136.             url = Ext.urlAppend(url, '_dc=' + (new Date().getTime()));
  137.         }
  138.         var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;
  139.         var trans = {
  140.             id : transId,
  141.             action: action,
  142.             cb : "stcCallback"+transId,
  143.             scriptId : "stcScript"+transId,
  144.             params : params,
  145.             arg : arg,
  146.             url : url,
  147.             callback : callback,
  148.             scope : scope,
  149.             reader : reader
  150.         };
  151.         window[trans.cb] = this.createCallback(action, rs, trans);
  152.         url += String.format("&{0}={1}", this.callbackParam, trans.cb);
  153.         if(this.autoAbort !== false){
  154.             this.abort();
  155.         }
  156.         trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);
  157.         var script = document.createElement("script");
  158.         script.setAttribute("src", url);
  159.         script.setAttribute("type", "text/javascript");
  160.         script.setAttribute("id", trans.scriptId);
  161.         this.head.appendChild(script);
  162.         this.trans = trans;
  163.     },
  164.     // @private createCallback
  165.     createCallback : function(action, rs, trans) {
  166.         var self = this;
  167.         return function(res) {
  168.             self.trans = false;
  169.             self.destroyTrans(trans, true);
  170.             if (action === Ext.data.Api.actions.read) {
  171.                 self.onRead.call(self, action, trans, res);
  172.             } else {
  173.                 self.onWrite.call(self, action, trans, res, rs);
  174.             }
  175.         };
  176.     },
  177.     /**
  178.      * Callback for read actions
  179.      * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
  180.      * @param {Object} trans The request transaction object
  181.      * @param {Object} res The server response
  182.      * @private
  183.      */
  184.     onRead : function(action, trans, res) {
  185.         var result;
  186.         try {
  187.             result = trans.reader.readRecords(res);
  188.         }catch(e){
  189.             // @deprecated: fire loadexception
  190.             this.fireEvent("loadexception", this, trans, res, e);
  191.             this.fireEvent('exception', this, 'response', action, trans, res, e);
  192.             trans.callback.call(trans.scope||window, null, trans.arg, false);
  193.             return;
  194.         }
  195.         if (result.success === false) {
  196.             // @deprecated: fire old loadexception for backwards-compat.
  197.             this.fireEvent('loadexception', this, trans, res);
  198.             this.fireEvent('exception', this, 'remote', action, trans, res, null);
  199.         } else {
  200.             this.fireEvent("load", this, res, trans.arg);
  201.         }
  202.         trans.callback.call(trans.scope||window, result, trans.arg, result.success);
  203.     },
  204.     /**
  205.      * Callback for write actions
  206.      * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
  207.      * @param {Object} trans The request transaction object
  208.      * @param {Object} res The server response
  209.      * @private
  210.      */
  211.     onWrite : function(action, trans, res, rs) {
  212.         var reader = trans.reader;
  213.         try {
  214.             // though we already have a response object here in STP, run through readResponse to catch any meta-data exceptions.
  215.             reader.readResponse(action, res);
  216.         } catch (e) {
  217.             this.fireEvent('exception', this, 'response', action, trans, res, e);
  218.             trans.callback.call(trans.scope||window, null, res, false);
  219.             return;
  220.         }
  221.         if(!res[reader.meta.successProperty] === true){
  222.             this.fireEvent('exception', this, 'remote', action, trans, res, rs);
  223.             trans.callback.call(trans.scope||window, null, res, false);
  224.             return;
  225.         }
  226.         this.fireEvent("write", this, action, res[reader.meta.root], res, rs, trans.arg );
  227.         trans.callback.call(trans.scope||window, res[reader.meta.root], res, true);
  228.     },
  229.     // private
  230.     isLoading : function(){
  231.         return this.trans ? true : false;
  232.     },
  233.     /**
  234.      * Abort the current server request.
  235.      */
  236.     abort : function(){
  237.         if(this.isLoading()){
  238.             this.destroyTrans(this.trans);
  239.         }
  240.     },
  241.     // private
  242.     destroyTrans : function(trans, isLoaded){
  243.         this.head.removeChild(document.getElementById(trans.scriptId));
  244.         clearTimeout(trans.timeoutId);
  245.         if(isLoaded){
  246.             window[trans.cb] = undefined;
  247.             try{
  248.                 delete window[trans.cb];
  249.             }catch(e){}
  250.         }else{
  251.             // if hasn't been loaded, wait for load to remove it to prevent script error
  252.             window[trans.cb] = function(){
  253.                 window[trans.cb] = undefined;
  254.                 try{
  255.                     delete window[trans.cb];
  256.                 }catch(e){}
  257.             };
  258.         }
  259.     },
  260.     // private
  261.     handleFailure : function(trans){
  262.         this.trans = false;
  263.         this.destroyTrans(trans, false);
  264.         if (trans.action === Ext.data.Api.actions.read) {
  265.             // @deprecated firing loadexception
  266.             this.fireEvent("loadexception", this, null, trans.arg);
  267.         }
  268.         this.fireEvent('exception', this, 'response', trans.action, {
  269.             response: null,
  270.             options: trans.arg
  271.         });
  272.         trans.callback.call(trans.scope||window, null, trans.arg, false);
  273.     },
  274.     // inherit docs
  275.     destroy: function(){
  276.         this.abort();
  277.         Ext.data.ScriptTagProxy.superclass.destroy.call(this);
  278.     }
  279. });/**
  280.  * @class Ext.data.HttpProxy
  281.  * @extends Ext.data.DataProxy
  282.  * <p>An implementation of {@link Ext.data.DataProxy} that processes data requests within the same
  283.  * domain of the originating page.</p>
  284.  * <p><b>Note</b>: this class cannot be used to retrieve data from a domain other
  285.  * than the domain from which the running page was served. For cross-domain requests, use a
  286.  * {@link Ext.data.ScriptTagProxy ScriptTagProxy}.</p>
  287.  * <p>Be aware that to enable the browser to parse an XML document, the server must set
  288.  * the Content-Type header in the HTTP response to "<tt>text/xml</tt>".</p>
  289.  * @constructor
  290.  * @param {Object} conn
  291.  * An {@link Ext.data.Connection} object, or options parameter to {@link Ext.Ajax#request}.
  292.  * <p>Note that if this HttpProxy is being used by a (@link Ext.data.Store Store}, then the
  293.  * Store's call to {@link #load} will override any specified <tt>callback</tt> and <tt>params</tt>
  294.  * options. In this case, use the Store's {@link Ext.data.Store#events events} to modify parameters,
  295.  * or react to loading events. The Store's {@link Ext.data.Store#baseParams baseParams} may also be
  296.  * used to pass parameters known at instantiation time.</p>
  297.  * <p>If an options parameter is passed, the singleton {@link Ext.Ajax} object will be used to make
  298.  * the request.</p>
  299.  */
  300. Ext.data.HttpProxy = function(conn){
  301.     Ext.data.HttpProxy.superclass.constructor.call(this, conn);
  302.     /**
  303.      * The Connection object (Or options parameter to {@link Ext.Ajax#request}) which this HttpProxy
  304.      * uses to make requests to the server. Properties of this object may be changed dynamically to
  305.      * change the way data is requested.
  306.      * @property
  307.      */
  308.     this.conn = conn;
  309.     // nullify the connection url.  The url param has been copied to 'this' above.  The connection
  310.     // url will be set during each execution of doRequest when buildUrl is called.  This makes it easier for users to override the
  311.     // connection url during beforeaction events (ie: beforeload, beforesave, etc).  The connection url will be nullified
  312.     // after each request as well.  Url is always re-defined during doRequest.
  313.     this.conn.url = null;
  314.     this.useAjax = !conn || !conn.events;
  315.     //private.  A hash containing active requests, keyed on action [Ext.data.Api.actions.create|read|update|destroy]
  316.     var actions = Ext.data.Api.actions;
  317.     this.activeRequest = {};
  318.     for (var verb in actions) {
  319.         this.activeRequest[actions[verb]] = undefined;
  320.     }
  321. };
  322. Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {
  323.     /**
  324.      * @cfg {Boolean} restful
  325.      * <p>If set to <tt>true</tt>, a {@link Ext.data.Record#phantom non-phantom} record's
  326.      * {@link Ext.data.Record#id id} will be appended to the url (defaults to <tt>false</tt>).</p><br>
  327.      * <p>The url is built based upon the action being executed <tt>[load|create|save|destroy]</tt>
  328.      * using the commensurate <tt>{@link #api}</tt> property, or if undefined default to the
  329.      * configured {@link Ext.data.Store}.{@link Ext.data.Store#url url}.</p><br>
  330.      * <p>Some MVC (e.g., Ruby on Rails, Merb and Django) support this style of segment based urls
  331.      * where the segments in the URL follow the Model-View-Controller approach.</p><pre><code>
  332.      * someSite.com/controller/action/id
  333.      * </code></pre>
  334.      * Where the segments in the url are typically:<div class="mdetail-params"><ul>
  335.      * <li>The first segment : represents the controller class that should be invoked.</li>
  336.      * <li>The second segment : represents the class function, or method, that should be called.</li>
  337.      * <li>The third segment : represents the ID (a variable typically passed to the method).</li>
  338.      * </ul></div></p>
  339.      * <p>For example:</p>
  340.      * <pre><code>
  341. api: {
  342.     load :    '/controller/load',
  343.     create :  '/controller/new',  // Server MUST return idProperty of new record
  344.     save :    '/controller/update',
  345.     destroy : '/controller/destroy_action'
  346. }
  347. // Alternatively, one can use the object-form to specify each API-action
  348. api: {
  349.     load: {url: 'read.php', method: 'GET'},
  350.     create: 'create.php',
  351.     destroy: 'destroy.php',
  352.     save: 'update.php'
  353. }
  354.      */
  355.     /**
  356.      * Return the {@link Ext.data.Connection} object being used by this Proxy.
  357.      * @return {Connection} The Connection object. This object may be used to subscribe to events on
  358.      * a finer-grained basis than the DataProxy events.
  359.      */
  360.     getConnection : function() {
  361.         return this.useAjax ? Ext.Ajax : this.conn;
  362.     },
  363.     /**
  364.      * Used for overriding the url used for a single request.  Designed to be called during a beforeaction event.  Calling setUrl
  365.      * will override any urls set via the api configuration parameter.  Set the optional parameter makePermanent to set the url for
  366.      * all subsequent requests.  If not set to makePermanent, the next request will use the same url or api configuration defined
  367.      * in the initial proxy configuration.
  368.      * @param {String} url
  369.      * @param {Boolean} makePermanent (Optional) [false]
  370.      *
  371.      * (e.g.: beforeload, beforesave, etc).
  372.      */
  373.     setUrl : function(url, makePermanent) {
  374.         this.conn.url = url;
  375.         if (makePermanent === true) {
  376.             this.url = url;
  377.             Ext.data.Api.prepare(this);
  378.         }
  379.     },
  380.     /**
  381.      * HttpProxy implementation of DataProxy#doRequest
  382.      * @param {String} action The crud action type (create, read, update, destroy)
  383.      * @param {Ext.data.Record/Ext.data.Record[]} rs If action is load, rs will be null
  384.      * @param {Object} params An object containing properties which are to be used as HTTP parameters
  385.      * for the request to the remote server.
  386.      * @param {Ext.data.DataReader} reader The Reader object which converts the data
  387.      * object into a block of Ext.data.Records.
  388.      * @param {Function} callback
  389.      * <div class="sub-desc"><p>A function to be called after the request.
  390.      * The <tt>callback</tt> is passed the following arguments:<ul>
  391.      * <li><tt>r</tt> : Ext.data.Record[] The block of Ext.data.Records.</li>
  392.      * <li><tt>options</tt>: Options object from the action request</li>
  393.      * <li><tt>success</tt>: Boolean success indicator</li></ul></p></div>
  394.      * @param {Object} scope The scope in which to call the callback
  395.      * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
  396.      */
  397.     doRequest : function(action, rs, params, reader, cb, scope, arg) {
  398.         var  o = {
  399.             method: (this.api[action]) ? this.api[action]['method'] : undefined,
  400.             request: {
  401.                 callback : cb,
  402.                 scope : scope,
  403.                 arg : arg
  404.             },
  405.             reader: reader,
  406.             callback : this.createCallback(action, rs),
  407.             scope: this
  408.         };
  409.         // Sample the request data:  If it's an object, then it hasn't been json-encoded yet.
  410.         // Transmit data using jsonData config of Ext.Ajax.request
  411.         if (typeof(params[reader.meta.root]) === 'object') {
  412.             o.jsonData = params;
  413.         } else {
  414.             o.params = params || {};
  415.         }
  416.         // Set the connection url.  If this.conn.url is not null here,
  417.         // the user may have overridden the url during a beforeaction event-handler.
  418.         // this.conn.url is nullified after each request.
  419.         if (this.conn.url === null) {
  420.             this.conn.url = this.buildUrl(action, rs);
  421.         }
  422.         else if (this.restful === true && rs instanceof Ext.data.Record && !rs.phantom) {
  423.             this.conn.url += '/' + rs.id;
  424.         }
  425.         if(this.useAjax){
  426.             Ext.applyIf(o, this.conn);
  427.             // If a currently running request is found for this action, abort it.
  428.             if (this.activeRequest[action]) {
  429.                 // Disabled aborting activeRequest while implementing REST.  activeRequest[action] will have to become an array
  430.                 //Ext.Ajax.abort(this.activeRequest[action]);
  431.             }
  432.             this.activeRequest[action] = Ext.Ajax.request(o);
  433.         }else{
  434.             this.conn.request(o);
  435.         }
  436.         // request is sent, nullify the connection url in preparation for the next request
  437.         this.conn.url = null;
  438.     },
  439.     /**
  440.      * Returns a callback function for a request.  Note a special case is made for the
  441.      * read action vs all the others.
  442.      * @param {String} action [create|update|delete|load]
  443.      * @param {Ext.data.Record[]} rs The Store-recordset being acted upon
  444.      * @private
  445.      */
  446.     createCallback : function(action, rs) {
  447.         return function(o, success, response) {
  448.             this.activeRequest[action] = undefined;
  449.             if (!success) {
  450.                 if (action === Ext.data.Api.actions.read) {
  451.                     // @deprecated: fire loadexception for backwards compat.
  452.                     this.fireEvent('loadexception', this, o, response);
  453.                 }
  454.                 this.fireEvent('exception', this, 'response', action, o, response);
  455.                 o.request.callback.call(o.request.scope, null, o.request.arg, false);
  456.                 return;
  457.             }
  458.             if (action === Ext.data.Api.actions.read) {
  459.                 this.onRead(action, o, response);
  460.             } else {
  461.                 this.onWrite(action, o, response, rs);
  462.             }
  463.         }
  464.     },
  465.     /**
  466.      * Callback for read action
  467.      * @param {String} action Action name as per {@link Ext.data.Api.actions#read}.
  468.      * @param {Object} o The request transaction object
  469.      * @param {Object} res The server response
  470.      * @private
  471.      */
  472.     onRead : function(action, o, response) {
  473.         var result;
  474.         try {
  475.             result = o.reader.read(response);
  476.         }catch(e){
  477.             // @deprecated: fire old loadexception for backwards-compat.
  478.             this.fireEvent('loadexception', this, o, response, e);
  479.             this.fireEvent('exception', this, 'response', action, o, response, e);
  480.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  481.             return;
  482.         }
  483.         if (result.success === false) {
  484.             // @deprecated: fire old loadexception for backwards-compat.
  485.             this.fireEvent('loadexception', this, o, response);
  486.             // Get DataReader read-back a response-object to pass along to exception event
  487.             var res = o.reader.readResponse(action, response);
  488.             this.fireEvent('exception', this, 'remote', action, o, res, null);
  489.         }
  490.         else {
  491.             this.fireEvent('load', this, o, o.request.arg);
  492.         }
  493.         o.request.callback.call(o.request.scope, result, o.request.arg, result.success);
  494.     },
  495.     /**
  496.      * Callback for write actions
  497.      * @param {String} action [Ext.data.Api.actions.create|read|update|destroy]
  498.      * @param {Object} trans The request transaction object
  499.      * @param {Object} res The server response
  500.      * @private
  501.      */
  502.     onWrite : function(action, o, response, rs) {
  503.         var reader = o.reader;
  504.         var res;
  505.         try {
  506.             res = reader.readResponse(action, response);
  507.         } catch (e) {
  508.             this.fireEvent('exception', this, 'response', action, o, response, e);
  509.             o.request.callback.call(o.request.scope, null, o.request.arg, false);
  510.             return;
  511.         }
  512.         if (res[reader.meta.successProperty] === false) {
  513.             this.fireEvent('exception', this, 'remote', action, o, res, rs);
  514.         } else {
  515.             this.fireEvent('write', this, action, res[reader.meta.root], res, rs, o.request.arg);
  516.         }
  517.         o.request.callback.call(o.request.scope, res[reader.meta.root], res, res[reader.meta.successProperty]);
  518.     },
  519.     // inherit docs
  520.     destroy: function(){
  521.         if(!this.useAjax){
  522.             this.conn.abort();
  523.         }else if(this.activeRequest){
  524.             var actions = Ext.data.Api.actions;
  525.             for (var verb in actions) {
  526.                 if(this.activeRequest[actions[verb]]){
  527.                     Ext.Ajax.abort(this.activeRequest[actions[verb]]);
  528.                 }
  529.             }
  530.         }
  531.         Ext.data.HttpProxy.superclass.destroy.call(this);
  532.     }
  533. });/**
  534.  * @class Ext.data.MemoryProxy
  535.  * @extends Ext.data.DataProxy
  536.  * An implementation of Ext.data.DataProxy that simply passes the data specified in its constructor
  537.  * to the Reader when its load method is called.
  538.  * @constructor
  539.  * @param {Object} data The data object which the Reader uses to construct a block of Ext.data.Records.
  540.  */
  541. Ext.data.MemoryProxy = function(data){
  542.     // Must define a dummy api with "read" action to satisfy DataProxy#doRequest and Ext.data.Api#prepare *before* calling super
  543.     var api = {};
  544.     api[Ext.data.Api.actions.read] = true;
  545.     Ext.data.MemoryProxy.superclass.constructor.call(this, {
  546.         api: api
  547.     });
  548.     this.data = data;
  549. };
  550. Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {
  551.     /**
  552.      * @event loadexception
  553.      * Fires if an exception occurs in the Proxy during data loading. Note that this event is also relayed
  554.      * through {@link Ext.data.Store}, so you can listen for it directly on any Store instance.
  555.      * @param {Object} this
  556.      * @param {Object} arg The callback's arg object passed to the {@link #load} function
  557.      * @param {Object} null This parameter does not apply and will always be null for MemoryProxy
  558.      * @param {Error} e The JavaScript Error object caught if the configured Reader could not read the data
  559.      */
  560.        /**
  561.      * MemoryProxy implementation of DataProxy#doRequest
  562.      * @param {String} action
  563.      * @param {Ext.data.Record/Ext.data.Record[]} rs If action is load, rs will be null
  564.      * @param {Object} params An object containing properties which are to be used as HTTP parameters
  565.      * for the request to the remote server.
  566.      * @param {Ext.data.DataReader} reader The Reader object which converts the data
  567.      * object into a block of Ext.data.Records.
  568.      * @param {Function} callback The function into which to pass the block of Ext.data.Records.
  569.      * The function must be passed <ul>
  570.      * <li>The Record block object</li>
  571.      * <li>The "arg" argument from the load function</li>
  572.      * <li>A boolean success indicator</li>
  573.      * </ul>
  574.      * @param {Object} scope The scope in which to call the callback
  575.      * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
  576.      */
  577.     doRequest : function(action, rs, params, reader, callback, scope, arg) {
  578.         // No implementation for CRUD in MemoryProxy.  Assumes all actions are 'load'
  579.         params = params || {};
  580.         var result;
  581.         try {
  582.             result = reader.readRecords(this.data);
  583.         }catch(e){
  584.             // @deprecated loadexception
  585.             this.fireEvent("loadexception", this, null, arg, e);
  586.             this.fireEvent('exception', this, 'response', action, arg, null, e);
  587.             callback.call(scope, null, arg, false);
  588.             return;
  589.         }
  590.         callback.call(scope, result, arg, true);
  591.     }
  592. });