Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Store - контроль статуса синхронизации (https://javascript.ru/forum/extjs/59738-store-kontrol-statusa-sinkhronizacii.html)

Infarch 24.11.2015 11:48

Store - контроль статуса синхронизации
 
Здравствуйте.

У меня есть вот такой стор:
Ext.define('SafetyRound.store.MeasurePoint', {
	extend: 'SafetyRound.store.InsistentStore',
	requires: ['SafetyRound.model.entity.SafetyRoundMeasurePoint'],
	model: 'SafetyRound.model.entity.SafetyRoundMeasurePoint',
	autoLoad: false,
	storeId: 'measurePointsAll',
	
	onBatchException: function (batch, operation) {
		alert("## MeasurePoint operation failed!");
		this.rejectChanges();
	},
    
	autoSync: true
});

Когда состав строк в нем меняется, autoSync отправляет данные на сервер для обработки. Если обработка по каким либо причинам невозможна, то сервер присылает код состояния 200 и такой вот json:
{ success: 0, message: 'You cannot edit the record' }

Я думал что в этом случае метод onBatchException откатит изменения, и покажет как либо сообщение об ошибке. Во всяком случае такого json хватает чтоб отловить ошибку обработки отдельно взятой модели.
По факту, метод срабатывает только тогда, когда сервер возвращает код состояния ошибки, например 500. Можно ли как-нибудь научить стор реагировать на "success: 0"?

khusamov 24.11.2015 12:55

По идее код состояния 500 и нужно возвращать с телом { success: 0, message: 'You cannot edit the record' }

у вас нет возможность изменить поведение сервера?

siber-biber 24.11.2015 13:03

на прокси есть событие exception: http://docs.sencha.com/extjs/6.0/6.0...vent-exception

Infarch 24.11.2015 13:15

Вот как раз и не могу. По конвенции, я возвращаю 200 и json с состоянием. Все прочие коды говорят об исключениях и генерятся на другом этаже приложения.

Infarch 24.11.2015 13:16

siber-biber, я это событие знаю и пробовал использовать. Оно не срабатывает если код 200.

siber-biber 24.11.2015 13:54

у меня всё чудесно работает. Правда я на load пробовал только:
var someStore = Ext.create("Ext.data.Store", {
        autoLoad : true,
        proxy    : {
            type   : 'ajax',
            url    : 'foo.js',
            method : 'GET',
            reader : {
                type : 'json'
            },
            listeners : {
                'exception' : function () {
                    debugger
                }
            }
        }
    });

novikov 24.11.2015 14:39

А прокси какого типа? AJAX или REST?

Infarch 24.11.2015 14:53

novikov, Ajax

novikov 24.11.2015 17:54

Раз уж начали переделывать приватный метод onBatchException, то почему бы не замахнуться на onBatchComplete? Напишите, например, overide этого метода для класса хранилища ProxyStore.

if (!operation.wasSuccessful()) { this.rejectChanges() }

А вообще, Вам нужно для хранилища определить два шаблонных метода:

onCreateRecords(records, operation, success)
onUpdateRecords(records, operation, success)

См. тут

siber-biber 24.11.2015 18:38

я всё еще не втыкаю в чем проблема ..событие exception на прокси работает всегда ..независимо от кода респонза.
я проверил на ext6.0.0

siber-biber 24.11.2015 18:44

https://fiddle.sencha.com/#fiddle/11j0

siber-biber 24.11.2015 18:55

или то же самое при sync-е: https://fiddle.sencha.com/#fiddle/11j2

novikov 25.11.2015 07:57

> я всё еще не втыкаю в чем проблема

Посмотрите на сеть в консоли. Ответ сервера 404 Not Found

siber-biber 25.11.2015 08:42

да есть такое в фидле ..всё верно. но локально у меня эта штука работала.
щас проверю еще раз

siber-biber 25.11.2015 09:03

в фидле с урлами ошибся. щас поправил всё работает как я сказал.

еще я заметил у вас в json вместо false используется 0 ..такой номер не пройдет ..в коде ридера строгая проверка либо false (булевый) либо стоока "false".


Часовой пояс GMT +3, время: 10:28.