Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / source / Operation.html
index 9f02fea..607500d 100644 (file)
@@ -3,8 +3,8 @@
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <title>The source code</title>
-  <link href="../prettify/prettify.css" type="text/css" rel="stylesheet" />
-  <script type="text/javascript" src="../prettify/prettify.js"></script>
+  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
+  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
   <style type="text/css">
     .highlight { display: block; background-color: #ddd; }
   </style>
 <body onload="prettyPrint(); highlight();">
   <pre class="prettyprint lang-js"><span id='Ext-data-Operation'>/**
 </span> * @author Ed Spencer
- * @class Ext.data.Operation
- * @extends Object
- * 
- * &lt;p&gt;Represents a single read or write operation performed by a {@link Ext.data.proxy.Proxy Proxy}.
- * Operation objects are used to enable communication between Stores and Proxies. Application
- * developers should rarely need to interact with Operation objects directly.&lt;/p&gt;
- * 
- * &lt;p&gt;Several Operations can be batched together in a {@link Ext.data.Batch batch}.&lt;/p&gt;
- * 
+ *
+ * Represents a single read or write operation performed by a {@link Ext.data.proxy.Proxy Proxy}. Operation objects are
+ * used to enable communication between Stores and Proxies. Application developers should rarely need to interact with
+ * Operation objects directly.
+ *
+ * Several Operations can be batched together in a {@link Ext.data.Batch batch}.
  */
 Ext.define('Ext.data.Operation', {
 <span id='Ext-data-Operation-cfg-synchronous'>    /**
-</span>     * @cfg {Boolean} synchronous True if this Operation is to be executed synchronously (defaults to true). This
-     * property is inspected by a {@link Ext.data.Batch Batch} to see if a series of Operations can be executed in
-     * parallel or not.
+</span>     * @cfg {Boolean} synchronous
+     * True if this Operation is to be executed synchronously. This property is inspected by a
+     * {@link Ext.data.Batch Batch} to see if a series of Operations can be executed in parallel or not.
      */
     synchronous: true,
-    
+
 <span id='Ext-data-Operation-cfg-action'>    /**
-</span>     * @cfg {String} action The action being performed by this Operation. Should be one of 'create', 'read', 'update' or 'destroy'
+</span>     * @cfg {String} action
+     * The action being performed by this Operation. Should be one of 'create', 'read', 'update' or 'destroy'.
      */
     action: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-filters'>    /**
-</span>     * @cfg {Array} filters Optional array of filter objects. Only applies to 'read' actions.
+</span>     * @cfg {Ext.util.Filter[]} filters
+     * Optional array of filter objects. Only applies to 'read' actions.
      */
     filters: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-sorters'>    /**
-</span>     * @cfg {Array} sorters Optional array of sorter objects. Only applies to 'read' actions.
+</span>     * @cfg {Ext.util.Sorter[]} sorters
+     * Optional array of sorter objects. Only applies to 'read' actions.
      */
     sorters: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-group'>    /**
-</span>     * @cfg {Object} group Optional grouping configuration. Only applies to 'read' actions where grouping is desired.
+</span>     * @cfg {Ext.util.Grouper} group
+     * Optional grouping configuration. Only applies to 'read' actions where grouping is desired.
      */
     group: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-start'>    /**
-</span>     * @cfg {Number} start The start index (offset), used in paging when running a 'read' action.
+</span>     * @cfg {Number} start
+     * The start index (offset), used in paging when running a 'read' action.
      */
     start: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-limit'>    /**
-</span>     * @cfg {Number} limit The number of records to load. Used on 'read' actions when paging is being used.
+</span>     * @cfg {Number} limit
+     * The number of records to load. Used on 'read' actions when paging is being used.
      */
     limit: undefined,
-    
+
 <span id='Ext-data-Operation-cfg-batch'>    /**
-</span>     * @cfg {Ext.data.Batch} batch The batch that this Operation is a part of (optional)
+</span>     * @cfg {Ext.data.Batch} batch
+     * The batch that this Operation is a part of.
      */
     batch: undefined,
-        
+
+<span id='Ext-data-Operation-cfg-callback'>    /**
+</span>     * @cfg {Function} callback
+     * Function to execute when operation completed.  Will be called with the following parameters:
+     *
+     * - records : Array of Ext.data.Model objects.
+     * - operation : The Ext.data.Operation itself.
+     * - success : True when operation completed successfully.
+     */
+    callback: undefined,
+
+<span id='Ext-data-Operation-cfg-scope'>    /**
+</span>     * @cfg {Object} scope
+     * Scope for the {@link #callback} function.
+     */
+    scope: undefined,
+
 <span id='Ext-data-Operation-property-started'>    /**
-</span>     * Read-only property tracking the start status of this Operation. Use {@link #isStarted}.
-     * @property started
-     * @type Boolean
+</span>     * @property {Boolean} started
+     * Read-only property tracking the start status of this Operation. Use {@link #isStarted}.
      * @private
      */
     started: false,
-    
+
 <span id='Ext-data-Operation-property-running'>    /**
-</span>     * Read-only property tracking the run status of this Operation. Use {@link #isRunning}.
-     * @property running
-     * @type Boolean
+</span>     * @property {Boolean} running
+     * Read-only property tracking the run status of this Operation. Use {@link #isRunning}.
      * @private
      */
     running: false,
-    
+
 <span id='Ext-data-Operation-property-complete'>    /**
-</span>     * Read-only property tracking the completion status of this Operation. Use {@link #isComplete}.
-     * @property complete
-     * @type Boolean
+</span>     * @property {Boolean} complete
+     * Read-only property tracking the completion status of this Operation. Use {@link #isComplete}.
      * @private
      */
     complete: false,
-    
+
 <span id='Ext-data-Operation-property-success'>    /**
-</span>     * Read-only property tracking whether the Operation was successful or not. This starts as undefined and is set to true
+</span>     * @property {Boolean} success
+     * Read-only property tracking whether the Operation was successful or not. This starts as undefined and is set to true
      * or false by the Proxy that is executing the Operation. It is also set to false by {@link #setException}. Use
      * {@link #wasSuccessful} to query success status.
-     * @property success
-     * @type Boolean
      * @private
      */
     success: undefined,
-    
+
 <span id='Ext-data-Operation-property-exception'>    /**
-</span>     * Read-only property tracking the exception status of this Operation. Use {@link #hasException} and see {@link #getError}.
-     * @property exception
-     * @type Boolean
+</span>     * @property {Boolean} exception
+     * Read-only property tracking the exception status of this Operation. Use {@link #hasException} and see {@link #getError}.
      * @private
      */
     exception: false,
-    
+
 <span id='Ext-data-Operation-property-error'>    /**
-</span>     * The error object passed when {@link #setException} was called. This could be any object or primitive.
-     * @property error
-     * @type Mixed
+</span>     * @property {String/Object} error
+     * The error object passed when {@link #setException} was called. This could be any object or primitive.
      * @private
      */
     error: undefined,
 
+<span id='Ext-data-Operation-property-actionCommitRecordsRe'>    /**
+</span>     * @property {RegExp} actionCommitRecordsRe
+     * The RegExp used to categorize actions that require record commits.
+     */
+    actionCommitRecordsRe: /^(?:create|update)$/i,
+
+<span id='Ext-data-Operation-property-actionSkipSyncRe'>    /**
+</span>     * @property {RegExp} actionSkipSyncRe
+     * The RegExp used to categorize actions that skip local record synchronization. This defaults
+     * to match 'destroy'.
+     */
+    actionSkipSyncRe: /^destroy$/i,
+
 <span id='Ext-data-Operation-method-constructor'>    /**
 </span>     * Creates new Operation object.
      * @param {Object} config (optional) Config object.
@@ -127,33 +154,76 @@ Ext.define('Ext.data.Operation', {
     constructor: function(config) {
         Ext.apply(this, config || {});
     },
-    
+
+<span id='Ext-data-Operation-method-commitRecords'>    /**
+</span>     * This method is called to commit data to this instance's records given the records in
+     * the server response. This is followed by calling {@link Ext.data.Model#commit} on all
+     * those records (for 'create' and 'update' actions).
+     *
+     * If this {@link #action} is 'destroy', any server records are ignored and the
+     * {@link Ext.data.Model#commit} method is not called.
+     *
+     * @param {Ext.data.Model[]} serverRecords An array of {@link Ext.data.Model} objects returned by
+     * the server.
+     * @markdown
+     */
+    commitRecords: function (serverRecords) {
+        var me = this,
+            mc, index, clientRecords, serverRec, clientRec;
+
+        if (!me.actionSkipSyncRe.test(me.action)) {
+            clientRecords = me.records;
+
+            if (clientRecords &amp;&amp; clientRecords.length) {
+                mc = Ext.create('Ext.util.MixedCollection', true, function(r) {return r.getId();});
+                mc.addAll(clientRecords);
+
+                for (index = serverRecords ? serverRecords.length : 0; index--; ) {
+                    serverRec = serverRecords[index];
+                    clientRec = mc.get(serverRec.getId());
+
+                    if (clientRec) {
+                        clientRec.beginEdit();
+                        clientRec.set(serverRec.data);
+                        clientRec.endEdit(true);
+                    }
+                }
+
+                if (me.actionCommitRecordsRe.test(me.action)) {
+                    for (index = clientRecords.length; index--; ) {
+                        clientRecords[index].commit();
+                    }
+                }
+            }
+        }
+    },
+
 <span id='Ext-data-Operation-method-setStarted'>    /**
-</span>     * Marks the Operation as started
+</span>     * Marks the Operation as started.
      */
     setStarted: function() {
         this.started = true;
         this.running = true;
     },
-    
+
 <span id='Ext-data-Operation-method-setCompleted'>    /**
-</span>     * Marks the Operation as completed
+</span>     * Marks the Operation as completed.
      */
     setCompleted: function() {
         this.complete = true;
         this.running  = false;
     },
-    
+
 <span id='Ext-data-Operation-method-setSuccessful'>    /**
-</span>     * Marks the Operation as successful
+</span>     * Marks the Operation as successful.
      */
     setSuccessful: function() {
         this.success = true;
     },
-    
+
 <span id='Ext-data-Operation-method-setException'>    /**
 </span>     * Marks the Operation as having experienced an exception. Can be supplied with an option error message/object.
-     * @param {Mixed} error Optional error string/object
+     * @param {String/Object} error (optional) error string/object
      */
     setException: function(error) {
         this.exception = true;
@@ -161,7 +231,7 @@ Ext.define('Ext.data.Operation', {
         this.running = false;
         this.error = error;
     },
-    
+
 <span id='Ext-data-Operation-method-hasException'>    /**
 </span>     * Returns true if this Operation encountered an exception (see also {@link #getError})
      * @return {Boolean} True if there was an exception
@@ -169,43 +239,43 @@ Ext.define('Ext.data.Operation', {
     hasException: function() {
         return this.exception === true;
     },
-    
+
 <span id='Ext-data-Operation-method-getError'>    /**
 </span>     * Returns the error string or object that was set using {@link #setException}
-     * @return {Mixed} The error object
+     * @return {String/Object} The error object
      */
     getError: function() {
         return this.error;
     },
-    
+
 <span id='Ext-data-Operation-method-getRecords'>    /**
 </span>     * Returns an array of Ext.data.Model instances as set by the Proxy.
-     * @return {Array} Any loaded Records
+     * @return {Ext.data.Model[]} Any loaded Records
      */
     getRecords: function() {
         var resultSet = this.getResultSet();
-        
+
         return (resultSet === undefined ? this.records : resultSet.records);
     },
-    
+
 <span id='Ext-data-Operation-method-getResultSet'>    /**
-</span>     * Returns the ResultSet object (if set by the Proxy). This object will contain the {@link Ext.data.Model model} instances
-     * as well as meta data such as number of instances fetched, number available etc
+</span>     * Returns the ResultSet object (if set by the Proxy). This object will contain the {@link Ext.data.Model model}
+     * instances as well as meta data such as number of instances fetched, number available etc
      * @return {Ext.data.ResultSet} The ResultSet object
      */
     getResultSet: function() {
         return this.resultSet;
     },
-    
+
 <span id='Ext-data-Operation-method-isStarted'>    /**
-</span>     * Returns true if the Operation has been started. Note that the Operation may have started AND completed,
-     * see {@link #isRunning} to test if the Operation is currently running.
+</span>     * Returns true if the Operation has been started. Note that the Operation may have started AND completed, see
+     * {@link #isRunning} to test if the Operation is currently running.
      * @return {Boolean} True if the Operation has started
      */
     isStarted: function() {
         return this.started === true;
     },
-    
+
 <span id='Ext-data-Operation-method-isRunning'>    /**
 </span>     * Returns true if the Operation has been started but has not yet completed.
      * @return {Boolean} True if the Operation is currently running
@@ -213,7 +283,7 @@ Ext.define('Ext.data.Operation', {
     isRunning: function() {
         return this.running === true;
     },
-    
+
 <span id='Ext-data-Operation-method-isComplete'>    /**
 </span>     * Returns true if the Operation has been completed
      * @return {Boolean} True if the Operation is complete
@@ -221,7 +291,7 @@ Ext.define('Ext.data.Operation', {
     isComplete: function() {
         return this.complete === true;
     },
-    
+
 <span id='Ext-data-Operation-method-wasSuccessful'>    /**
 </span>     * Returns true if the Operation has completed and was successful
      * @return {Boolean} True if successful
@@ -229,7 +299,7 @@ Ext.define('Ext.data.Operation', {
     wasSuccessful: function() {
         return this.isComplete() &amp;&amp; this.success === true;
     },
-    
+
 <span id='Ext-data-Operation-method-setBatch'>    /**
 </span>     * @private
      * Associates this Operation with a Batch
@@ -238,7 +308,7 @@ Ext.define('Ext.data.Operation', {
     setBatch: function(batch) {
         this.batch = batch;
     },
-    
+
 <span id='Ext-data-Operation-method-allowWrite'>    /**
 </span>     * Checks whether this operation should cause writing to occur.
      * @return {Boolean} Whether the operation should cause a write to occur.