/** * This class is used internally by `{@link Ext.data.Session#getSaveBatch}` and is * not intended for direct use. It can be studied as an example of implementing a visitor * to pass to `{@link Ext.data.Session#visitData}`. * @protected * @since 5.0.0 */Ext.define('Ext.data.session.BatchVisitor', { map: null, constructor: function(batch) { this.batch = batch; }, getBatch: function(sort) { var map = this.map, batch = this.batch, bucket, entity, name, operation, operationType, proxy, batchActions, records, len, i; if (map) { if (!batch) { batch = new Ext.data.Batch(); } for (name in map) { bucket = map[name]; entity = bucket.entity; // the entity class proxy = entity.getProxy(); batchActions = proxy.getBatchActions(); delete bucket.entity; // so we don't think its an operation for (operationType in bucket) { if (batchActions) { operation = proxy.createOperation(operationType, { records: bucket[operationType] }); operation.entityType = entity; batch.add(operation); } else { records = bucket[operationType]; for (i = 0, len = records.length; i < len; ++i) { operation = proxy.createOperation(operationType, { records: [records[i]] }); operation.entityType = entity; batch.add(operation); } } } } } if (batch && sort !== false) { batch.sort(); } return batch; }, onDirtyRecord: function(record) { var me = this, operation = record.phantom ? 'create' : (record.dropped ? 'destroy' : 'update'), name = record.$className, map = (me.map || (me.map = {})), bucket = (map[name] || (map[name] = { entity: record.self })); // User: { // entity: User, // create: [ // { id: 20, name: 'Don' } // ] // } bucket = bucket[operation] || (bucket[operation] = []); bucket.push(record); }});