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, время: 14:24. |