0

ExtJs 不期望来自服务器的响应与 ExtJs 4 相同的响应来确认更新行。

我有一个带有字符串 id 的表:

Ext.define('App.Product', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'productid', type: 'string'},
        {name: 'ord', , type: 'int'},
        (...)
    ],
    idProperty: 'nrproduit'
})

保存更改后,ExtJs 客户端将修改后的数据发送到服务器:

[{"ord":1,"productid":"SG30301"},{"ord":3,"productid":"SG30100"}]

在 ExtJs 4.2 中,它期望服务器将两个产品的完整数据发回,如下所示:

{
    "success":true,
    "data":[{
        "nrproduit":"SG30100",
        "ord":3,
        "author":"...",
        "editor":"...",
        (...)
    },{
        "nrproduit":"SG30301",
        "ord":3,
        "author":"...",
        "editor":"...",
        (...)
    }]
}

在 ExtJs 6.2 中,这不再有效。我得到错误

未捕获的错误:旧密钥“SG30301”的项目的新密钥“SG30100”重复

显然,客户端没有考虑到idProperty,但似乎期望响应中的行顺序与请求中的相同。

有没有办法强制客户端考虑从服务器发回的 id?还是有必要更改服务器代码?是否有关于 ExtJs 4.2 和 6.2 在客户端和服务器之间的数据同步方面的确切变化的文档,这些详细信息?

4

3 回答 3

1

ExtJS 考虑顺序是因为 id 可以改变,例如在插入操作期间(如果 id 是在服务器端生成的)。为此,在一般情况下,ExtJS 期望以与发送记录相同的顺序从服务器接收结果。

然而,还有更多。在某些情况下,它使用 id,而不是 order。您可以阅读Operation.doProcess以了解 ExtJS 是如何完成它的工作的,并且如果您需要不同的行为,可能会覆盖它。

编辑:当模型具有属性时它使用 id clientIdProperty,否则它使用顺序。因此,像这样添加它就足够了:

Ext.define('App.Product', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'productid', type: 'string'},
        {name: 'ord', , type: 'int'},
        (...)
    ],
    idProperty: 'nrproduit',
    clientIdProperty: 'nrproduit'
})
于 2017-05-01T17:30:37.933 回答
1

另一种替代解决方案,如果您不想更改服务器端代码来处理clientIdProperty属性,则禁用批处理模式(使用batchActions: false),并且您的所有请求都将被逐个处理。

这是为了防止错误"extjs Ext.util.Collection.updateKey(): Duplicate newKey for item with oldKey"。用他的方法,你会失去一些效率。

您必须将其添加到您的模型中:

   ...
   proxy: {
        type: 'direct',
        extraParams: {
            defaultTable: '...',
            defaultSortColumn: '...',
            defaultSordDirection: 'ASC'
        },
        batchActions: false, // avoid clientIdProperty
        api: {        
            read: 'Server.Util.read',
            create: 'Server.Util.create',
            update: 'Server.Util.update',
            destroy: 'Server.Util.destroy'
        },
        reader: {
于 2021-02-02T23:33:35.943 回答
0

只需在模型定义上添加clientIdProperty 即可解决问题。

更多信息。在 sencha 论坛上也提出了同样的问题,但没有提到解决方案。这是该讨论的链接-

https://www.sencha.com/forum/showthread.php?301898-Duplicate-newKey-quot-x-quot-for-item-with-oldKey-quot-xx-quot

于 2018-04-30T13:08:41.950 回答