ExtJs 6 - ajax 更新请求的变化

ExtJs 6 - change in ajax update requests

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

我有一个 table 字符串 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 中,这不再有效。我收到错误

Uncaught Error: Duplicate newKey "SG30100" for item with oldKey "SG30301"

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

有没有办法强制客户端考虑从服务器发回的 ID?或者是否需要更改服务器代码?是否有关于 ExtJs 4.2 和 6.2 在客户端和服务器之间的数据同步方面究竟发生了什么变化的文档,其中包含这些细节?

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

然而,还有更多。在某些情况下,它使用 id,而不是顺序。您可以阅读 Operation.doProcess 来了解 ExtJS 是如何做的,如果您需要不同的行为,也可以覆盖它。

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

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

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

更多信息。 sencha 论坛上有人问过同样的问题,但那里没有提到解决方案。这是该讨论的 link -

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

另一个替代解决方案,如果您不想更改服务器端代码来处理 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: {