2017-05-30 26 views
1

我尝试实现一个像this example一般的rowediting网格,区别在于我希望将更改与服务器后端同步。到现在为止,我可以添加一个新的行onRoweditAdd带同步的rowedit网格

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

我试图重现,但是,[我的情况下,只有创建被称为,从不更新。奇怪。](https://fiddle.sencha.com/#view/editor&fiddle/20j3) – Alexander

+0

即使我已经尝试过,不能重现它,请分享小提琴,如果可能的话。 –

+0

@Alexander我找到了解决办法,看看我的答案。如果你明白为什么不允许创建一个ID为0的记录,把它作为你的答案,我会接受它。 –

回答

4

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

在引擎盖下,ExtJS将记录标记为幻影:true或false。幻影记录是仅存在于前端并且尚未被保存的记录。没有id创建一个记录将其标记为幻影,而创建已提供不其标记为幻影的ID记录,并不会触发建立呼叫,但一个更新,而不是

+0

谢谢你的解释。这与ExtJs 4有所不同,其中'id == 0'表示*新记录* –

1

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

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

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

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

的问题有,因为ExtJS的5做的新的执行记录ID的东西,但是我无法解释...

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

1

我发现,在Ext.data.ModelidProperty作为识别记录的唯一键。默认情况下它有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' 

请参阅link