Как отключить автоматическую синхронизацию магазина в ExtJS - PullRequest
2 голосов
/ 02 февраля 2012

Версия ExtJS: ext-4.0.7-gpl.

При синхронизации хранилища сервер возвращает мне тот же объект в формате JSON, но заполненный сгенерированными идентификаторами, которые мне нужно поместить в данные моего хранилища.Идентификаторы находятся во вложенных объектах, например:

{
    "id": 46,
    "name": "Excel",
    "typeExt": [{
        "ext": "xls",
        "id": "137",
        "isMain": "false",
    }, {
        "ext": "xslx",
        "id": "136",
        "isMain": "false",
    }]
}

Таким образом, идентификаторы 137 и 136 генерируются на стороне сервера.

Я пытаюсь сделать это впрокси магазина (редактирование: тип Ajax) (что само по себе может быть ошибочным):

proxy.afterRequest = function(request) {
     if (request.action === 'create' && request.records.length == 1) {
         me.store.autoSync = false;
         var created = Ext.JSON.decode(request.operation.response.responseText);
         request.records[0].set('id', created.id);
         request.records[0].set('typeExt', created.typeExt);
         //request.records[0].modified = {};
         //request.records[0].dirty = false;
         me.store.autoSync = true;
     }
     if (request.action === 'update' && request.records.length == 1) {
         var updated = Ext.JSON.decode(request.operation.response.responseText);
         me.store.autoSync = false;
         request.records[0].set('typeExt', updated.typeExt);
         me.store.autoSync = true;
     }

 };

См. закомментированные варианты.

Если я не установлю autoSync на false, он будет зацикливаться бесконечно.

Если я не очищу эти read-only поля modified и dirty,измененные записи включаются в следующий запрос синхронизации, если я отредактировал другую запись, она отправляет Array записей, которые нарушают мою службу на стороне сервера.

Если я очищаю dirty иmodified Как показано в закомментированных строках, операция обновления работает только один раз.Я нажимаю кнопку «Обновить» в диалоговом окне плагина RowEditing, но он никогда не отправляет нужный запрос на сервер во второй раз.

В последнем случае, я думаю, я что-то сломал, отредактировав вручную поля только для чтения, но не могуне найти что.

Как люди обычно решают подобные проблемы?

PS.

request.records[0].commit(true); || request.records[0].editing = false; 

|| request.records[0].beginEdit(); 

Испытывались также без перерыва.

Ответы [ 2 ]

3 голосов
/ 22 января 2014

Хотя это не принесет вам пользы в Ext 4.0.7, в Ext 4.1.0 были добавлены методы suspendAutoSync и resumeAutoSync . Надеюсь, это будет полезно для кого-то еще.

2 голосов
/ 02 февраля 2012

У меня это работает для грид-магазинов с Ext 4.0.7, но есть похожие проблемы с дровяными хранилищами.Все это с прямым прокси-сервером (и autosync true)

Если вы посмотрите на код Ext.data.Store::onCreateRecords, вы увидите, что записи в хранилище заменяются записями, возвращенными с сервера,учитывая, что порядок тот же.

Итак, это довольно просто: просто верните с сервера тот же самый json / объект, отправленный методу create, но с установленным идентификатором, и он должен автоматически обновлять их примагазин.

Я знаю, что это не сильно поможет, но, возможно, даст вам какое-то направление.

Думаю, это поможет, если вы упомянете:

  • тип прокси, который вы используете
  • точная версия ext
  • возможно код, инициирующий создание записи
...