Сетка rowedit с синхронизацией
Я пытаюсь реализовать общую сетку редактирования строк, как в этом примере, с той разницей, что я хотел бы синхронизировать изменения с серверной частью. До сих пор я могу добавить новую строку с onRoweditAdd
,
Ext.define('Mb.view.base.RoweditListController', {
extend: 'Ext.app.ViewController',
alias: 'controller.roweditlist',
onRoweditAdd: function(me){
var grid = me.up('panel'),
edit = grid.editingPlugin,
store = grid.getStore(),
record = store.getModel().create({id: 0});
edit.cancelEdit()
store.insert(0, record)
edit.startEdit(record, 0)
},
editRowedit: function(editor, ctx) {
var store = ctx.grid.getStore();
store.sync()
}
})
Проблема в том, что store.sync()
не отправляет create
запрос к серверу, но update
запрос. Это выглядит как store.insert(0, record)
не учитывается. Синхронизируется только модификация, выполненная пользователем. Что может быть виновником?
3 ответа
Давая существующий id
В записи ExtJS предполагает, что эта запись уже существует в вашем магазине и должна быть обновлена. Если вы не дадите идентификатор, тогда он предполагает, что это вновь созданная запись, и пойдет по пути создания. Это исходит из предположения о том, что вы используете сгенерированную стратегию идентификации (что вам обычно следует), и, таким образом, вы никогда не предоставите идентификаторы самостоятельно при создании.
ExtJS помечает запись как фантомную: true или false. Фантомные записи - это те, которые существуют только во внешнем интерфейсе и еще не были сохранены. Создание записи без id
помечает ее как фантомную, тогда как создание записи с уже предоставленным идентификатором не помечает ее как фантомную и не инициирует вызов create, а вместо этого выполняет обновление
К сожалению, я не смог создать скрипку, которая воспроизводит проблему.
Я решил это, изменив эту строку:
record = store.getModel().create({id: 0});
в
record = store.getModel().create({});
Проблема связана с новой реализацией идентификаторов записей, начиная с ExtJs 5. Но я не могу это объяснить...
Создание новой записи с id: 0
больше не должен поддерживаться в ExtJs 6.
Я нашел это в Ext.data.Model
idProperty
используется как уникальный ключ для идентификации записи. По умолчанию имеетid
набор полей. Если вы предоставите дубликат, то это вызовет проблему в store
,
Это описание написано в ExtJS doc
The data values for this field must be unique or there will be id value collisions in the Ext.data.Store.
Defaults to:
'id'
Пожалуйста, обратитесь ссылку