我尝试实现像this example这样的常规划线网格,不同之处在于我希望将更改与服务器后端同步。到目前为止,我可以使用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)
似乎没有被考虑在内。仅同步用户完成的修改。可能是罪魁祸首?
答案 0 :(得分:4)
通过在记录中提供现有id
,ExtJS假定您的商店中已存在此记录,并且必须进行更新。如果你没有给出一个id,那么它假设它是一个新创建的记录,并将进入创建路径。这是因为您假设您使用生成的ID策略(通常应该这样做),因此您在创建时不会自己提供ID。
引擎盖下,ExtJS将记录标记为幻像:真或假。幻影记录是仅存在于前端并且尚未持久化的记录。创建没有id
的记录会将其标记为幻像,而创建已提供id的记录不会将其标记为幻像,也不会触发创建调用而是更新
答案 1 :(得分:1)
不幸的是,我无法创造出能够再现问题的小提琴。
我通过改变这一行来解决它:
record = store.getModel().create({id: 0});
到
record = store.getModel().create({});
自ExtJs 5以来,问题必须对记录ID的新实现做些什么。但是我无法解释它......
ExtJs 6中不再支持使用id: 0
创建新记录。
答案 2 :(得分:1)
我发现在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'
请参阅link