123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <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>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-data-Operation'>/**
- </span> * @author Ed Spencer
- *
- * 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. 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'.
- */
- action: undefined,
- <span id='Ext-data-Operation-cfg-filters'> /**
- </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 {Ext.util.Sorter[]} sorters
- * Optional array of sorter objects. Only applies to 'read' actions.
- */
- sorters: undefined,
- <span id='Ext-data-Operation-cfg-groupers'> /**
- </span> * @cfg {Ext.util.Grouper[]} groupers
- * Optional grouping configuration. Only applies to 'read' actions where grouping is desired.
- */
- groupers: undefined,
- <span id='Ext-data-Operation-cfg-start'> /**
- </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.
- */
- limit: undefined,
- <span id='Ext-data-Operation-cfg-batch'> /**
- </span> * @cfg {Ext.data.Batch} batch
- * The batch that this Operation is a part of.
- */
- batch: undefined,
-
- <span id='Ext-data-Operation-cfg-params'> /**
- </span> * @cfg {Object} params
- * Parameters to pass along with the request when performing the operation.
- */
- <span id='Ext-data-Operation-cfg-callback'> /**
- </span> * @cfg {Function} callback
- * Function to execute when operation completed.
- * @cfg {Ext.data.Model[]} callback.records Array of records.
- * @cfg {Ext.data.Operation} callback.operation The Operation itself.
- * @cfg {Boolean} callback.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> * @property {Boolean} started
- * The start status of this Operation. Use {@link #isStarted}.
- * @readonly
- * @private
- */
- started: false,
- <span id='Ext-data-Operation-property-running'> /**
- </span> * @property {Boolean} running
- * The run status of this Operation. Use {@link #isRunning}.
- * @readonly
- * @private
- */
- running: false,
- <span id='Ext-data-Operation-property-complete'> /**
- </span> * @property {Boolean} complete
- * The completion status of this Operation. Use {@link #isComplete}.
- * @readonly
- * @private
- */
- complete: false,
- <span id='Ext-data-Operation-property-success'> /**
- </span> * @property {Boolean} success
- * 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.
- * @readonly
- * @private
- */
- success: undefined,
- <span id='Ext-data-Operation-property-exception'> /**
- </span> * @property {Boolean} exception
- * The exception status of this Operation. Use {@link #hasException} and see {@link #getError}.
- * @readonly
- * @private
- */
- exception: false,
- <span id='Ext-data-Operation-property-error'> /**
- </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.
- */
- 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, i, len;
- if (!me.actionSkipSyncRe.test(me.action)) {
- clientRecords = me.records;
- if (clientRecords && clientRecords.length) {
- if (clientRecords.length > 1) {
- // If this operation has multiple records, client records need to be matched up with server records
- // so that any data returned from the server can be updated in the client records. If we don't have
- // a clientIdProperty specified on the model and we've done a create, just assume the data is returned in order.
- // If it's an update, the records should already have an id which should match what the server returns.
- if (me.action == 'update' || clientRecords[0].clientIdProperty) {
- mc = new Ext.util.MixedCollection();
- mc.addAll(serverRecords);
- for (index = clientRecords.length; index--; ) {
- clientRec = clientRecords[index];
- serverRec = mc.findBy(me.matchClientRec, clientRec);
- // Replace client record data with server record data
- clientRec.copyFrom(serverRec);
- }
- } else {
- for (i = 0, len = clientRecords.length; i < len; ++i) {
- clientRec = clientRecords[i];
- serverRec = serverRecords[i];
- if (clientRec && serverRec) {
- me.updateRecord(clientRec, serverRec);
- }
- }
- }
- } else {
- // operation only has one record, so just match the first client record up with the first server record
- this.updateRecord(clientRecords[0], serverRecords[0]);
- }
- if (me.actionCommitRecordsRe.test(me.action)) {
- for (index = clientRecords.length; index--; ) {
- clientRecords[index].commit();
- }
- }
- }
- }
- },
-
- updateRecord: function(clientRec, serverRec) {
- // if the client record is not a phantom, make sure the ids match before replacing the client data with server data.
- if(serverRec && (clientRec.phantom || clientRec.getId() === serverRec.getId())) {
- clientRec.copyFrom(serverRec);
- }
- },
- // Private.
- // Record matching function used by commitRecords
- // IMPORTANT: This is called in the scope of the clientRec being matched
- matchClientRec: function(record) {
- var clientRec = this,
- clientRecordId = clientRec.getId();
- if(clientRecordId && record.getId() === clientRecordId) {
- return true;
- }
- // if the server record cannot be found by id, find by internalId.
- // this allows client records that did not previously exist on the server
- // to be updated with the correct server id and data.
- return record.internalId === clientRec.internalId;
- },
- <span id='Ext-data-Operation-method-setStarted'> /**
- </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.
- */
- setCompleted: function() {
- this.complete = true;
- this.running = false;
- },
- <span id='Ext-data-Operation-method-setSuccessful'> /**
- </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 {String/Object} error (optional) error string/object
- */
- setException: function(error) {
- this.exception = true;
- this.success = false;
- 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
- */
- 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 {String/Object} The error object
- */
- getError: function() {
- return this.error;
- },
- <span id='Ext-data-Operation-method-getRecords'> /**
- </span> * Returns the {@link Ext.data.Model record}s associated with this operation. For read operations the records as set by the {@link Ext.data.proxy.Proxy Proxy} will be returned (returns `null` if the proxy has not yet set the records).
- * For create, update, and destroy operations the operation's initially configured records will be returned, although the proxy may modify these records' data at some point after the operation is initialized.
- * @return {Ext.data.Model[]}
- */
- getRecords: function() {
- var resultSet = this.getResultSet();
- return this.records || (resultSet ? resultSet.records : null);
- },
- <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
- * @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.
- * @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
- */
- 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
- */
- 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
- */
- wasSuccessful: function() {
- return this.isComplete() && this.success === true;
- },
- <span id='Ext-data-Operation-method-setBatch'> /**
- </span> * @private
- * Associates this Operation with a Batch
- * @param {Ext.data.Batch} batch The batch
- */
- 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.
- */
- allowWrite: function() {
- return this.action != 'read';
- }
- });
- </pre>
- </body>
- </html>
|