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; } }); |
Fiddle сделайте пжлст.
|
Вот фидл: https://fiddle.sencha.com/#fiddle/12p4
Там правда в консоли все тихо, но при удалении нескольких записей через sync ни один хендлер не срабатывает. Если удалять одну запись то получаю срабатывание success. ExtJS у меня 5.1.1.451, тема Crisp. |
Немного поигрался с дебагером. Проблема возникает вот в этом методе:
sendRequest: function(request) { request.setRawRequest(Ext.Ajax.request(request.getCurrentConfig())); this.lastRequest = request; return request; }, Видимо, некий колбек у Ext.Ajax.request и есть причина бага. Но вот какой??? |
Зарепортил баг на офф форуме: https://www.sencha.com/forum/showthr...i-is-undefined
Жду ответа... |
items - пустой набор записей. после уданения пустого массива, никакие события не выбрасываются. ID и id - это разные ключи. Выберите один, или рассматривайте их как два разных поля.
|
Вы правы, в имя поля ошибка вкралась. Я поправил фидл, теперь ошибку стало видно как следует, и в консоли тоже. Мне ответили на форуме, что ошибка исправлена в версии 5.1.2 Разве уже такая есть? Мне казалось, моя версия последняя.
|
5.1.2 есть
|
Да, мне ответили в той теме на офф. форуме. Только вот...
Ext JS 5.1.2 is a Support-only release, so you'd have to download it from the Support portal. Не понимаю, зачем мне на нее кивать, если она некая особенная. В общем, там была еще одна ссылочка на тред с патчем. Пофиксал свой экст, пока полет нормальный. |
5.1.2 ничем не особенная, обычный фикс-релиз. Такие релизы доступны по платной подписке, о чём вам и сообщили.
|
Часовой пояс GMT +3, время: 20:46. |