1

我尝试像这个示例一样实现一个通用的行编辑网格,不同之处在于我想将更改与服务器后端同步。到现在为止,我可以用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)没有计入。仅同步用户所做的修改。罪魁祸首可能是什么?

4

3 回答 3

4

通过在记录中提供一个现有id的,ExtJS 假定该记录已经存在于您的商店中并且必须更新。如果您不提供 id,那么它会假定它是新创建的记录,并且会走创建路线。这是因为假设您使用生成的 ID 策略(通常应该这样做),因此您永远不会在创建时自己提供 ID。

在后台,ExtJS 将记录标记为幻像:真或假。幻影记录是仅存在于前端且尚未持久化的记录。创建没有 no 的记录id会将其标记为幻影,而创建具有已提供 id 的记录不会将其标记为幻影,也不会触发创建调用,而是触发更新

于 2017-05-31T07:44:07.420 回答
1

不幸的是,我无法创建一个重现问题的小提琴。

我通过改变这一行来解决它:

record = store.getModel().create({id: 0});

record = store.getModel().create({});

这个问题与自 ExtJs 5 以来记录 ID 的新实现有关。但我无法解释......

id: 0ExtJs 6 不再支持创建新记录。

于 2017-05-31T07:35:56.960 回答
1

我发现 inExt.data.Model idProperty被用作识别记录的唯一键。默认情况下,它具有id字段集。如果您提供重复的内容,则会导致store.

这个描述写在 ExtJS 文档中

The data values for this field must be unique or there will be id value collisions in the Ext.data.Store.
Defaults to:
'id'

请参考链接

于 2017-05-31T09:19:14.383 回答