Javascript 将记录添加到存储

Javascript 将记录添加到存储,javascript,extjs,Javascript,Extjs,我有一个可编辑的网格、存储和一个按钮。 该按钮有一个处理程序,用于复制所选记录并将副本添加到存储: var a = gridPanel.getSelectionModel().getSelectedCell(); var rec = store.getAt(a[0]).copy(); store.addSorted(rec); alert (store.getAt(1).get('date')); 但是存储和网格没有更新。警报有错误-无法调用未定义的方法 这里的问题是

我有一个可编辑的网格、存储和一个按钮。 该按钮有一个处理程序,用于复制所选记录并将副本添加到存储:

var a = gridPanel.getSelectionModel().getSelectedCell();

    var rec = store.getAt(a[0]).copy();
    store.addSorted(rec);
    alert (store.getAt(1).get('date'));
但是存储和网格没有更新。警报有错误-无法调用未定义的方法


这里的问题是什么?

问题可能是复制的记录具有相同的id,因此当您将其插入存储时,另一个具有相同id的记录已经存在

如果在将复制的记录添加到存储区之前生成新id并将其应用于该记录,则该id应能正常工作。以下代码在作为参数传递的记录中生成一个新ID。检查的文件


大多数JavaScript开发人员应该做的几件事:

  • 使用firebug,如果启用“所有错误上的中断”,它可能会向您显示store.get(1)正在返回未定义,并在您尝试对未定义的错误调用函数时导致错误

  • 现在您已经有了firebug,请在window.alert()上使用console.log()语句。使用console.log,您实际上可以看到并检查它,它也适用于异步内容和鼠标事件

  • 至于你的问题: 调用record.copy()然后将其插入存储区会导致问题,如果您不给它一个id。如果您有firebug并查看了代码,您会发现:

    if(this.containsKey(key)){
     this.suspendEvents();
     this.removeKey(key);
     this.resumeEvents();
     }
    
    要生成具有唯一密钥的记录,可以执行以下操作:

    var rec = store.getAt(a[0]).copy();
    var id = Ext.data.Record.id(id);
    rec.id = id;
    

    代码看起来很混乱,但是没有很多好的方法。如果是我,我会覆盖复制函数,以使用布尔值强制自动生成记录的id。

    谢谢您的建议。我正在使用铬“检查元素”-对我来说很好。我知道rec没有插入,但我不明白为什么。在ExtJS 6.2.1到6.6.0中,这可以通过使用此模型的方法及其参数来实现
    var rec = store.getAt(a[0]).copy();
    var id = Ext.data.Record.id(id);
    rec.id = id;