2016-11-16 4 views
-3

я магазин, который я добавил записей, а также отредактированные существующие записи вExtJS 6 - Store.Proxy.Sync - ExtraParams для обновления, но не создавать

Теперь я хочу, чтобы синхронизировать эти данные обратно на сервер. ,

Использование store.sync()

Это выстреливает отдельные запросы для каждого из синхронизации типов (C, R, U, D) (с использованием значений прокси API)

Для каждого типа синхронизации, мне нужно пройти динамический extraParam (позволяет сделать его простым и сказать extraParam = {type: "Update"} для обновлений и extraParam = {type: "Add"} для добавления), хотя в приложении это будет нечто более сложное, например, передача объекта JSON деталей пользователя или параметров на основе синхронизируемых записей.

Должен быть способ сделать это, без необходимости вручную кодировать функцию синхронизации.

Может ли кто-нибудь привести пример этого, если это возможно, или лучший подход?

ответ

0

Ваш сервер прокси принимает api свойство, которое содержит различные URL-адреса:

api: { 
    read:'MyReadEndpoint', 
    create:'MyCreateEndpoint', 
    update:'MyUpdateEndpoint', 
    delete:'MyDeleteEndpoint' 
} 

Насколько я знаю, вы можете напрямую добавлять параметры GET в этих URLs:

api: { 
    read:'MyEndpoint?action=read', 
    create:'MyEndpoint?action=create', 
    update:'MyEndpoint?action=update', 
    delete:'MyEndpoint?action=delete' 
} 

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

+0

Спасибо, да, я искал конфигурацию api при поиске решения самостоятельно, но это не очень хорошее решение (хотя, возможно, очень EXT), так как переписывание списка api прокси приведет к другим вызовам прокси, которые с асинхронной природой из ext, могут иметь странные последствия ... но спасибо. – TolMera

+1

Это решение, которое делает именно то, что вы сказали нам, что хотите, но удача в нахождении лучшего ... Я бы сказал, что ваш вопрос не является самоочевидным. – Alexander

0

Это было мое окончательное решение

мне нужно более ездить на существующую функцию синхронизации, и мог бы сделать так, загрузив новое определение в папку Замены, но вместо этого решил поставить это в моем магазине.

Код для этого следует:

Ext.define('db_mubin.store', { 
extend: 'Ext.data.Store' 
,alias: 'store.db_mubin-store' 

,require: 'db_mubin.model' 
,model: 'db_mubin.model' 

,proxy: { 
    type: 'ajax' 
    ,url: '/api' 
    ,reader: { 
     type: 'json' 
     ,rootProperty: 'data' 
    } 
    ,writer: { 
     allowSingle: false 
    } 
    ,extraParams: { 
     calling: 'mubin' 
    } 
} 

,listeners: { 
    //add: function(){this.sync({})}, 
    //update: function(){this.sync({})}, 
    //remove: function(){this.sync({})} 
} 

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

    options = options || {}; 
    options.params = options.params || {}; 

    //<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; 
    me.isSyncing = true; 

    if (toCreate.length > 0) { 
     options.params.fetch = 'create'; 
     operations.create = toCreate; 
     me.proxy.batch(Ext.apply(options, { 
      operations: operations, 
      listeners: listeners, 
      params: options.params 
     })); 
     operations = {}; 
    } 

    if (toUpdate.length > 0) { 
     options.params.fetch = 'update'; 
     operations.update = toUpdate; 
     me.proxy.batch(Ext.apply(options, { 
      operations: operations, 
      listeners: listeners, 
      params: options.params 
     })); 
     operations = {}; 
    } 

    if (toDestroy.length > 0) { 
     options.params.fetch = 'destroy'; 
     operations.destroy = toDestroy; 
     me.proxy.batch(Ext.apply(options, { 
      operations: operations, 
      listeners: listeners, 
      params: options.params 
     })); 
     operations = {}; 
    } 
    me.isSyncing = false; 

    return me; 
} 
}); 

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

Смежные вопросы