带有同步的rowedit网格

时间:2017-05-30 15:51:25

标签: extjs extjs6 extjs-stores

我尝试实现像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)似乎没有被考虑在内。仅同步用户完成的修改。可能是罪魁祸首?

3 个答案:

答案 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