【问题标题】:ExtJs 6 - change in ajax update requestsExtJs 6 - ajax 更新请求的变化
【发布时间】:2017-05-01 16:32:00
【问题描述】:

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 中,这不再有效。我收到错误

未捕获的错误:与 oldKey “SG30301”的项目重复 newKey “SG30100”

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

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

【问题讨论】:

    标签: extjs extjs4 upgrade extjs6 extjs-stores


    【解决方案1】:

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

    但是,还有更多。在某些情况下,它使用 id,而不是 order。你可以阅读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,它标识返回的记录,否则它是创建对应关系的顺序。
    • 重要的一点:在 ExtJs 中,updatecreate 如果服务器不发送任何数据,则默认提交。如果我没记错(并正确解释docs.sencha.com/extjs/4.2.2/source/…,在 ExtJs 4.2 中,服务器需要发回记录数据。
    【解决方案2】:

    如果您不想更改服务器端代码来处理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: {
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢您的链接
      猜你喜欢
      • 2021-06-27
      • 2019-01-10
      • 2019-06-09
      • 2012-12-12
      • 2012-09-28
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多