Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.12.2015, 17:56
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

TypeError: clientRecords[i] is undefined
Здравствуйте.

У меня возникла ошибка, никак не пойму в чем дело. Итак, есть модель, стор, и код который удаляет из стора записи:
Ext.define('SafetyRound.model.entity.SafetyRoundMeasurePoint', {
	extend: 'Ext.data.Model',
	idProperty: 'ID',
	fields: [
		{ name: 'ID', type: 'int' },
		{ name: 'SafetyRoundProject_ID', type: 'int' },
		{ name: 'SafetyRoundMeasurePoint_ID', type: 'int', allowNull: true },
		{ name: 'OrderNumber', type: 'int' },
		{ name: 'Active', type: 'boolean' },
		'Name'
	],
	proxy: {
		type: 'ajax',
		idParam: 'ID',
		pageParam: '',
		limitParam: '',
		startParam: '',
		reader: {
			type: 'json',
			rootProperty: 'data',
			messageProperty: 'error'
		},
		writer: {
			type: 'json'
		},
		api: {
			create: '/json?cmd=sr.measurepoint.create',
			read: '/json?cmd=sr.measurepoint.read',
			update: '/json?cmd=sr.measurepoint.update',
			destroy: '/json?cmd=sr.measurepoint.destroy'
		}
	}

});

Ext.define('SafetyRound.store.entity.MeasurePoint', {
	extend: 'SafetyRound.store.InsistentStore',
	requires: ['SafetyRound.model.entity.SafetyRoundMeasurePoint'],
	model: 'SafetyRound.model.entity.SafetyRoundMeasurePoint',
	autoLoad: false,
	storeId: 'measurePointsAll',
	autoSync: true
});

// и код

deleteMeasurePoint: function(record){
	var
		store = record.store,
		rec_id = record.get('ID'),
		children = store.query('SafetyRoundMeasurePoint_ID', rec_id),
		i = 0;
	store.beginUpdate();
	children.each(function(item){
		store.remove(item);
	});
	store.remove(record);
	store.each(function(item){
		item.set('OrderNumber', i++);
	});
	store.endUpdate();
}

Как видите, иногда удаляются записи у которых есть дочерние элементы. Тогда я и их удаляю из стора, а он синхронизирует изменения с сервером. Так вот когда удаляется более одной записи то команда на удаление проходит, апдейты тоже проходят, грид отображает изменения стора, но в консоли ошибка TypeError: clientRecords[i] is undefined.

В другом месте приложения есть очень похожий код, с другим стором и моделями. Так вот там у стора autosync=false, а синхронизирую я его через прямой вызов метода sync. Опять таки, если записей больше одной то вылезает эта ошибка и sync не вызывает хендлер success, а это уже гораздо печальнее. Серверный запрос сработать успевает, корректно передает json.

Что не так???

зы: ошибка вылезает вот тут (ext-all-rtl-debug.js):
Ext.define('Ext.data.operation.Destroy', {
    extend: 'Ext.data.operation.Operation',
    alias: 'data.operation.destroy',
    action: 'destroy',
    isDestroyOperation: true,
    order: 30,
    foreignKeyDirection: -1,
    doProcess: function() 
    {
        var clientRecords = this.getRecords(),
            clientLen = clientRecords.length,
            i;
        for (i = 0; i < clientLen; ++i) {
            clientRecords[i].setErased(); // <----------------------
        }
    },
    doExecute: function() {
        return this.getProxy().erase(this);
    },
    getRecordData: function(record, operation) {
        var data = {},
            idField = record.idField,
            nameProperty = this.getNameProperty() || 'name';
        data[idField[nameProperty]] = record.id;
        return data;
    }
});
Ответить с цитированием
  #2 (permalink)  
Старый 17.12.2015, 21:27
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Fiddle сделайте пжлст.
Ответить с цитированием
  #3 (permalink)  
Старый 18.12.2015, 12:33
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Вот фидл: https://fiddle.sencha.com/#fiddle/12p4
Там правда в консоли все тихо, но при удалении нескольких записей через sync ни один хендлер не срабатывает. Если удалять одну запись то получаю срабатывание success. ExtJS у меня 5.1.1.451, тема Crisp.
Ответить с цитированием
  #4 (permalink)  
Старый 18.12.2015, 13:45
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Немного поигрался с дебагером. Проблема возникает вот в этом методе:
sendRequest: function(request) {
        request.setRawRequest(Ext.Ajax.request(request.getCurrentConfig()));
        this.lastRequest = request;
        return request;
    },

Видимо, некий колбек у Ext.Ajax.request и есть причина бага. Но вот какой???
Ответить с цитированием
  #5 (permalink)  
Старый 22.12.2015, 16:48
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Зарепортил баг на офф форуме: https://www.sencha.com/forum/showthr...i-is-undefined
Жду ответа...
Ответить с цитированием
  #6 (permalink)  
Старый 22.12.2015, 17:15
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

items - пустой набор записей. после уданения пустого массива, никакие события не выбрасываются. ID и id - это разные ключи. Выберите один, или рассматривайте их как два разных поля.
Ответить с цитированием
  #7 (permalink)  
Старый 22.12.2015, 22:22
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Вы правы, в имя поля ошибка вкралась. Я поправил фидл, теперь ошибку стало видно как следует, и в консоли тоже. Мне ответили на форуме, что ошибка исправлена в версии 5.1.2 Разве уже такая есть? Мне казалось, моя версия последняя.
Ответить с цитированием
  #8 (permalink)  
Старый 25.12.2015, 09:35
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

5.1.2 есть
Ответить с цитированием
  #9 (permalink)  
Старый 25.12.2015, 11:06
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Да, мне ответили в той теме на офф. форуме. Только вот...
Ext JS 5.1.2 is a Support-only release, so you'd have to download it from the Support portal.
Не понимаю, зачем мне на нее кивать, если она некая особенная. В общем, там была еще одна ссылочка на тред с патчем. Пофиксал свой экст, пока полет нормальный.
Ответить с цитированием
  #10 (permalink)  
Старый 05.01.2016, 02:31
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

5.1.2 ничем не особенная, обычный фикс-релиз. Такие релизы доступны по платной подписке, о чём вам и сообщили.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как побить undefined ? Jnas Общие вопросы Javascript 0 30.10.2012 10:19
Google Chrome: GET http://url/url undefined (undefined) Kirumbik Opera, Safari и др. 0 07.05.2011 23:26
Чем отличается undefined от null hrundel Общие вопросы Javascript 21 01.01.2011 22:06
Операторы сравнения, null, undefined, number 0, empty string("") alexeis Общие вопросы Javascript 5 28.09.2010 21:11