Как добавить обратные вызовы синхронизации для хранения в ExtJS

У меня есть магазин, который я хочу синхронизировать вручную каждый раз, когда выполняются определенные действия.

Я видел этот вопрос и < href="https://stackoverflow.com/questions/35226480/extjs-6-access-messageproperty-in-store-syncs-callback">это тоже.

Я хотел бы знать, есть ли способ установить функции обратного вызова синхронизации по умолчанию в конфигурациях хранилища.

Я знаю, что могу сделать что-то вроде этого:

store.sync({
        success: function(batch, options) {
            console.log('ok');
        },
        failure: function(batch, options) {
            console.log('not ok');
        }
    });

Но я хочу определить обратные вызовы один раз в самом магазине, а затем просто вызову store.sync();

Вот пример магазина, с которым я работаю:

Ext.define('MyApp.store.MyStore', {
    extend: 'Ext.data.Store',
    alias: 'store.MyStore',
    model: 'MyApp.model.MyModel',
    autoLoad: true,
    proxy: {
        type: 'rest',
        url: '../../api/myEndPoint',
        noCache: false,
        reader: {
            type: 'json',
            rootProperty: 'data',
            successProperty: 'success',
            totalProperty: 'total'
        },
        actionMethods: {
            read: 'GET',
            destroy: 'DELETE'
        },
        extraParams: {
            type: 'aux'
        }
    },
});

person Brugui    schedule 13.05.2020    source источник


Ответы (2)


Если есть способ добиться желаемого средствами фреймворка, то я его не нашел.

Всегда есть другой вариант, вы можете обернуть синхронизацию в функцию и вызывать эту функцию каждый раз, когда хотите синхронизироваться с этими конкретными обратными вызовами:

function sync({
    success = (batch, options) => console.log('ok'),
    failure = (batch, options) => console.log('not ok')
} = {}) {
    store.sync({success, failure});
}

Вы можете изменить функции по умолчанию в параметрах, передав параметры:

// default paramters will be used
sync();

// just one parameter
sync({
  failure: () => {
    console.log('new failure handler');
  }
});

// both parameters
sync({
  success: () => {
    console.log('new success handler');
  },
  failure: () => {
    console.log('new failure handler');
  }
});

Учтите, что если обратные вызовы по умолчанию для магазина когда-либо будут реализованы, это решение, вероятно, будет считаться «взломом». Переход к собственному решению фреймворка был бы лучшей идеей.

person Timofey Biryukov    schedule 13.05.2020

Я бы решил эту проблему, переопределив метод sync магазина.

Синхронизация в основном вызывает метод batch прокси-сервера, который поддерживает успешные и неудачные обратные вызовы. Поэтому, если вы установите, например, обратные вызовы syncSuccess и syncFailure в своем магазине, они будут вызываться только после синхронизации магазина.

Примечания:

  • Я тестировал решение на версии 7.1.0. Проверьте различия в методах синхронизации для вашей версии.
  • Вам нужно добавить дополнительную логику для случая, когда обратные вызовы не определены в магазине
Ext.define('Overrides.data.Store', {
    override: 'Ext.data.Store',

    sync: function(options) {
        var me = this,
            operations = {},
            toCreate = me.getNewRecords(),
            toUpdate = me.getUpdatedRecords(),
            toDestroy = me.getRemovedRecords(),
            needsSync = false;

        //<debug>
        if (me.isSyncing) {
            Ext.log.warn('Sync called while a sync operation is in progress. ' +
                         'Consider configuring autoSync as false.');
        }
        //</debug>

        me.needsSync = false;

        if (toCreate.length > 0) {
            operations.create = toCreate;
            needsSync = true;
        }

        if (toUpdate.length > 0) {
            operations.update = toUpdate;
            needsSync = true;
        }

        if (toDestroy.length > 0) {
            operations.destroy = toDestroy;
            needsSync = true;
        }

        if (needsSync && me.fireEvent('beforesync', operations) !== false) {
            me.isSyncing = true;

            options = options || {};

            me.proxy.batch(Ext.apply(options, {
                operations: operations,
                listeners: me.getBatchListeners(),
                $destroyOwner: me,
                success: me.syncSuccess,
                failure: me.syncFailure
            }));
        }

        return me;
    }
});
person ground_call    schedule 14.05.2020