2012-02-02 7 views
1

Версия ExtJS - ext-4.0.7-gpl.Как отключить автоматическую синхронизацию магазина в ExtJS

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

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

поэтому идентификаторы 137 и 136 генерируются на Serverside.

Я пытаюсь сделать это в магазине, прокси (Edit: 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, он бесконечно зацикливается.

Если я не очистить эти «только для чтения» поле «модифицированный» и «грязный» модифицированные записи включены в следующем запросе Syncronization, если я редактировал другую запись, он посылает массив записей что нарушает мой серверный сервис.

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

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

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

PS. request.records [0] .commit (истина); || request.records [0] .editing = false; || request.records [0] .beginEdit(); были опробованы и без обработки.

ответ

2

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

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

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

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

Я думаю, что это поможет, если вы упоминаете:

  • тип прокси вы используете
  • точную версию доб
  • возможно код инициирует создание записи
+0

спасибо! код довольно грязный. это 'Picker', который открывает сетку для редактирования subarray типаExt. существует два метода: valueToRaw и rawToValue, которые делают String из массива 'typeExt', созданного конкатенацией полей' ext'. на самом деле, с 'Picker' он работает, но они хотят, чтобы я позволил отредактировать конкатенированную String и создать из него общий массив' typeExt'. я отлаживал этот код, чтобы убедиться, что 'pickerfield' будет соответствующим образом обновлен ... если я найду, как временно отключить autoSync, и проблема останется, я посмотрю ближе к этому коду, возможно, после синхронизации этой системы произойдет сбой. – fedd

+0

еще раз спасибо, хотя ваш ответ не совсем по моему вопросу, вы помогли мне решить мою проблему. я хотел бы принять ваш ответ, но это не по правилам сайта, я думаю. вы можете изменить свой ответ: «нет хорошего способа отключить автосинхронизацию», и я соглашусь, хорошо? – fedd

3

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