将记录添加到商店

时间:2011-03-01 20:56:33

标签: javascript extjs

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

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

    var rec = store.getAt(a[0]).copy();
    store.addSorted(rec);
    alert (store.getAt(1).get('date'));

但是商店和网格没有更新。警报有错误 - 无法调用未定义的方法。

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

问题可能是复制的记录具有相同的ID,因此当您将其插入商店时,已存在具有相同ID的另一条记录。

如果在将复制的记录添加到商店之前生成并应用新的ID,它应该可以正常工作。以下代码在作为参数传递的记录中生成新ID。查看Ext.data.Record.copy

的文档
Ext.data.Record.id(rec);

答案 1 :(得分:0)

大多数JavaScript开发人员应该做的事情很少:

  1. 使用firebug,如果你打开所有错误的中断,它可能会显示store.get(1)返回undefing并在你尝试调用未定义的函数时导致错误。

  2. 现在你有了firebug在window.alert()上使用console.log()语句。使用console.log,你可以实际看到它的检查,它也适用于异步的东西和鼠标事件。

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

    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自动生成。