Store do something after sync with autoSync enabled

后端 未结 3 1340
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-15 01:45

I\'m trying to detect and remove those fields that after a sync are still on the store but are not added to the database (success: false). Then, return an error message to t

相关标签:
3条回答
  • 2020-12-15 02:13

    This is, if you ask me, some design flaw in ExtJS.

    AbstractStore has onCreateRecords, onUpdateRecords, and onDestroyRecords, which are empty functions you can override. You can call rejectChanges() if success is false there.

    Ext.define('BS.store.Users', {
        extend: 'Ext.data.Store',    
        model: 'BS.model.User',
    
        autoSync: true,
        autoLoad: true,
    
        proxy: {
            type: 'direct',
            api: {
                create: Users.Create,
                read: Users.Get,
                update: Users.Update,
                destroy: Users.Delete,
    
            },
            reader: {
                type: 'json',
                root: 'data',
            },
        },
    
        onCreateRecords: function(records, operation, success) {
            console.log(records);
        },
    
        onUpdateRecords: function(records, operation, success) {
            console.log(records);
        },
    
        onDestroyRecords: function(records, operation, success) {
            console.log(records);
        },
    
    });
    
    0 讨论(0)
  • 2020-12-15 02:16

    Another way to get around this is to use suspendAutoSync and resumeAutoSync methods of the store and then manually sync (Ext JS > 4.1.0):

    store.suspendAutoSync();
    store.insert(0, record);
    store.sync({
       success: function (batch, options) {
          // do something
       },
       failure: function (batch, options){
          // handle error
       }
    });
    store.resumeAutoSync();
    
    0 讨论(0)
  • 2020-12-15 02:24

    FYI: Sequence of events when updating a record (ExtJs 5.0.1)

    Scenerio 1
    javascript executes 
    record.set('some data')  // Store has autoSync: true, The database will succeed
    
    'update' event fires (operation = 'edit')
    'beforesync' event fires
    network traffic occurs database returns a success (json)
    'update' event fires (operation = 'commit') 
    'onUpdateRecord' method runs
    
    Scenerio 2
    javascript executes
    record.set('some data')  // Store has autoSync: true, The database will fail
    
    'update' event fires (operation = 'edit')
    'beforesync' event fires
    network traffic occurs database returns a failure (json)
    'onUpdateRecord' method runs and calls rejectChanges()
    'update' event fires (operation = 'reject') 
    'exception' event fires
    

    Two Notes: a) the last update and onUpdateRecord are reversed and b) if the onUpdateRecord does not call rejectChanges() the following 'update' event is not fired. This will leave the record in a dirty state which means that subsequent sync() will send it.

    For record.add() the events are similar however I see that the 'add' event is not fired. The Ext documentation for the event says that it is fired but the same documentation does not say that the add() method will fire the event.

    0 讨论(0)
提交回复
热议问题