Application Structure:
  • CRUD-in-Grid-batch-sync
    • app
      • controller
        • StudentMaster.js
      • model
        • Student.js
      • store
        • Student.js
      • view
        • StudentGrid.js
    • app.js
    • default.html
    • ext-4.2.1
    • resources

Example: Batch Sync in ExtJS 4 Grid.

controller\StudentMaster.js
Ext.define('School.controller.StudentMaster', 
{
    extend : 'Ext.app.Controller',
    models : ['School.model.Student'],
    stores : ['School.store.Student'],
    views: ['School.view.StudentGrid'],

    refs : [{
        ref : 'studentGrid',
        selector : 'viewport StudentGrid'
    }],
    
    init : function(){
        
        this.control({
            'viewport > StudentGrid button[itemId=btnSave]': 
            {
                click : this.onSaveClick
            },
            'viewport > StudentGrid button[itemId=btnCreate]': 
            {
                click : this.onCreateClick
            },
            'viewport > StudentGrid button[itemId=btnDelete]': 
            {
                click : this.onDeleteClick
            },
            'viewport > StudentGrid button[itemId=btnLoad]' : 
            {
                click : this.onLoadClick
            }
        });
    },
    
    onSaveClick : function(){
        
        
        var studentGrid = this.getStudentGrid();
        var studentStore = studentGrid.getStore(studentStore);
        
        //fires create, update and delete request when calling sync and commit changes in the store when autoSync=false
        studentStore.sync({
            
            success : function(batch, opt){
                Ext.Msg.alert('Status', 'Changes saved successfully.');
            },
            failure : function(batch, opt){
                var msg = '';
                
                if(batch.hasException){
                    
                    for(var i = 0; i < batch.exceptions.length; i ++ ){
                        switch(batch.exceptions[i].action){
                            case "destroy" : 
                                msg = msg + batch.exceptions[i].records.length + " Delete, ";
                                break;
                            case "update" : 
                                msg = msg + batch.exceptions[i].records.length + " Update, ";
                                break;
                            case "create" : 
                                msg = msg + batch.exceptions[i].records.length + " Create, ";
                                break;
                        }
                    }
                    
                    Ext.Msg.alert("Status", msg + " operation failed!");
                }
                else
                    Ext.Msg.alert('Status', 'Changes failed.');
            }
        });
        
        
    },
    
    onLoadClick : function(){
        
        var studentStore = Ext.create('School.store.Student');
        studentStore.load({
            scope : this,
            callback : function(records, operation, success){
                
                var studentGrid = this.getStudentGrid();
                studentGrid.bindStore(studentStore);
            }
        });
        
    },
    onCreateClick : function(){
        
        var studentGrid = this.getStudentGrid();
        var studentStore = studentGrid.getStore();
        
        var studentModel = Ext.create('School.model.Student');
        studentModel.set("firstName", "New student's first name");
        studentModel.set("middleName", "New student's middle name");
        studentModel.set("lastName", "New student's last name");
        studentModel.set("birthDate", "11/01/2011");
        studentModel.set("city", "New city");
        studentModel.set("state", "New state");
        studentStore.add(studentModel);
        
        
    },
    onDeleteClick : function(){
        
        var studentGrid = this.getStudentGrid();
        var studentStore = studentGrid.getStore();
        
        var selectedRows = studentGrid.getSelectionModel().getSelection();
        if(selectedRows.length)
            studentStore.remove(selectedRows);
        else
            Ext.Msg.alert('Status', 'Please select at least one record to delete!');
    }
});

Preview