ExtJs 6 - AJAX 更新请求中的更改

dfddblmv  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(159)

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之间在客户端和服务器之间的数据同步方面的具体变化?

knpiaxh1

knpiaxh11#

ExtJS会考虑顺序,因为id可能会改变,例如在插入操作期间(如果id是在服务器端生成的)。为了允许这种情况,在一般情况下,ExtJS希望从服务器接收结果的顺序与发送记录的顺序相同。
但是,它还有更多的功能。在某些情况下,它使用id,而不是顺序。你可以读取Operation.doProcess来了解ExtJS是如何完成它所做的事情的,如果你需要不同的行为,可能会覆盖它。
编辑:当模型具有clientIdProperty属性时,它使用id,否则使用order。因此,这样添加就足够了:

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

q5lcpyga2#

如果您不想更改服务器端代码来处理clientIdProperty属性,另一种替代解决方案是禁用批处理模式(使用batchActions: false),然后逐个处理所有请求。
这是防止错误 “extjs Ext.util.Collection.updateKey():为具有oldKey” 的项目复制newKey。使用他的方法,您将失去一些效率。
您必须将以下内容添加到模型中:

...
   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: {
klr1opcd

klr1opcd3#

只需在模型定义上添加clientIdProperty即可解决此问题。
一些更多的信息。同样的问题已经问了 Sencha 论坛,但解决方案没有提到那里。这里是链接到该讨论-
https://www.sencha.com/forum/showthread.php?301898-Duplicate-newKey-quot-x-quot-for-item-with-oldKey-quot-xx-quot

相关问题